home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / plnk081.zip / pilot-link.0.8.1 / Perl5 / Pilot.xs < prev    next >
Text File  |  1997-08-08  |  91KB  |  3,887 lines

  1. #include "EXTERN.h"
  2. #include "perl.h"
  3. #include "XSUB.h"
  4. #include "patchlevel.h"
  5.  
  6. #include "pi-macros.h"
  7. #include "pi-file.h"
  8. #include "pi-datebook.h"
  9. #include "pi-memo.h"
  10. #include "pi-expense.h"
  11. #include "pi-address.h"
  12. #include "pi-todo.h"
  13. #include "pi-mail.h"
  14. #include "pi-socket.h"
  15. #include "pi-dlp.h"
  16. #include "pi-syspkt.h"
  17.  
  18. static int
  19. not_here(s)
  20. char *s;
  21. {
  22.     croak("%s not implemented on this architecture", s);
  23.     return -1;
  24. }
  25.  
  26. static double
  27. constant(name, arg)
  28. char *name;
  29. int arg;
  30. {
  31.     errno = 0;
  32.     switch (*name) {
  33.     case 'A':
  34.     break;
  35.     case 'B':
  36.     break;
  37.     case 'C':
  38.     break;
  39.     case 'D':
  40.     break;
  41.     case 'E':
  42.     break;
  43.     case 'F':
  44.     break;
  45.     case 'G':
  46.     break;
  47.     case 'H':
  48.     break;
  49.     case 'I':
  50.     break;
  51.     case 'J':
  52.     break;
  53.     case 'K':
  54.     break;
  55.     case 'L':
  56.     break;
  57.     case 'M':
  58.     break;
  59.     case 'N':
  60.     break;
  61.     case 'O':
  62.     break;
  63.     case 'P':
  64.     if (strEQ(name, "PI_AF_SLP"))
  65. #ifdef PI_AF_SLP
  66.         return PI_AF_SLP;
  67. #else
  68.         goto not_there;
  69. #endif
  70.     if (strEQ(name, "PI_PF_LOOP"))
  71. #ifdef PI_PF_LOOP
  72.         return PI_PF_LOOP;
  73. #else
  74.         goto not_there;
  75. #endif
  76.     if (strEQ(name, "PI_PF_PADP"))
  77. #ifdef PI_PF_PADP
  78.         return PI_PF_PADP;
  79. #else
  80.         goto not_there;
  81. #endif
  82.     if (strEQ(name, "PI_PF_SLP"))
  83. #ifdef PI_PF_SLP
  84.         return PI_PF_SLP;
  85. #else
  86.         goto not_there;
  87. #endif
  88.     if (strEQ(name, "PI_PilotSocketConsole"))
  89. #ifdef PI_PilotSocketConsole
  90.         return PI_PilotSocketConsole;
  91. #else
  92.         goto not_there;
  93. #endif
  94.     if (strEQ(name, "PI_PilotSocketDLP"))
  95. #ifdef PI_PilotSocketDLP
  96.         return PI_PilotSocketDLP;
  97. #else
  98.         goto not_there;
  99. #endif
  100.     if (strEQ(name, "PI_PilotSocketDebugger"))
  101. #ifdef PI_PilotSocketDebugger
  102.         return PI_PilotSocketDebugger;
  103. #else
  104.         goto not_there;
  105. #endif
  106.     if (strEQ(name, "PI_PilotSocketRemoteUI"))
  107. #ifdef PI_PilotSocketRemoteUI
  108.         return PI_PilotSocketRemoteUI;
  109. #else
  110.         goto not_there;
  111. #endif
  112.     if (strEQ(name, "PI_SOCK_DGRAM"))
  113. #ifdef PI_SOCK_DGRAM
  114.         return PI_SOCK_DGRAM;
  115. #else
  116.         goto not_there;
  117. #endif
  118.     if (strEQ(name, "PI_SOCK_RAW"))
  119. #ifdef PI_SOCK_RAW
  120.         return PI_SOCK_RAW;
  121. #else
  122.         goto not_there;
  123. #endif
  124.     if (strEQ(name, "PI_SOCK_SEQPACKET"))
  125. #ifdef PI_SOCK_SEQPACKET
  126.         return PI_SOCK_SEQPACKET;
  127. #else
  128.         goto not_there;
  129. #endif
  130.     if (strEQ(name, "PI_SOCK_STREAM"))
  131. #ifdef PI_SOCK_STREAM
  132.         return PI_SOCK_STREAM;
  133. #else
  134.         goto not_there;
  135. #endif
  136.     break;
  137.     case 'Q':
  138.     break;
  139.     case 'R':
  140.     break;
  141.     case 'S':
  142.     break;
  143.     case 'T':
  144.     break;
  145.     case 'U':
  146.     break;
  147.     case 'V':
  148.     break;
  149.     case 'W':
  150.     break;
  151.     case 'X':
  152.     break;
  153.     case 'Y':
  154.     break;
  155.     case 'Z':
  156.     break;
  157.     case 'd': 
  158. #define DoName(x) if (strEQ(name, STRINGIFY(x))) return x
  159.  
  160.         if (strlen(name)>3) {
  161.             switch (name[3]) {
  162.             case 'O':
  163.                 DoName(dlpOpenRead);
  164.                 DoName(dlpOpenWrite);
  165.                 DoName(dlpOpenExclusive);
  166.                 DoName(dlpOpenSecret);
  167.                 DoName(dlpOpenReadWrite);
  168.                 break;
  169.             case 'E':
  170.                 DoName(dlpEndCodeNormal);
  171.                 DoName(dlpEndCodeOutOfMemory);
  172.                 DoName(dlpEndCodeUserCan);
  173.                 DoName(dlpEndCodeOther);
  174.                 break;
  175.             case 'R':
  176.                 DoName(dlpRecAttrDeleted);
  177.                 DoName(dlpRecAttrDirty);
  178.                 DoName(dlpRecAttrBusy);
  179.                 DoName(dlpRecAttrSecret);
  180.                 DoName(dlpRecAttrArchived);
  181.                 break;
  182.                case 'D':
  183.                 DoName(dlpDBFlagResource);
  184.                 DoName(dlpDBFlagReadOnly);
  185.                 DoName(dlpDBFlagAppInfoDirty);
  186.                 DoName(dlpDBFlagBackup);
  187.                 DoName(dlpDBFlagOpen);
  188.                 DoName(dlpDBFlagNewer);
  189.                 DoName(dlpDBFlagReset);
  190.                 
  191.                 DoName(dlpDBListRAM);
  192.                 DoName(dlpDBListROM);
  193.                 break;
  194.             }
  195.         }
  196.         break;
  197.     }
  198.     errno = EINVAL;
  199.     return 0;
  200.  
  201. not_there:
  202.     errno = ENOENT;
  203.     return 0;
  204. }
  205.  
  206. static char mybuf[0xffff];
  207.  
  208. static AV * tmtoav (struct tm * t) {
  209.     AV * ret = newAV();
  210.     
  211.     av_push(ret, newSViv(t->tm_sec));
  212.     av_push(ret, newSViv(t->tm_min));
  213.     av_push(ret, newSViv(t->tm_hour));
  214.     av_push(ret, newSViv(t->tm_mday));
  215.     av_push(ret, newSViv(t->tm_mon));
  216.     av_push(ret, newSViv(t->tm_year));
  217.     av_push(ret, newSViv(t->tm_wday));
  218.     av_push(ret, newSViv(t->tm_yday));
  219.     av_push(ret, newSViv(t->tm_isdst));
  220.     
  221.     return ret;
  222. }
  223.  
  224. struct tm * avtotm (AV * av, struct tm * t) {
  225.     SV ** s;
  226.     t->tm_sec = (s = av_fetch(av, 0, 0)) ? SvIV(*s) : 0;
  227.     t->tm_min = (s = av_fetch(av, 1, 0)) ? SvIV(*s) : 0;
  228.     t->tm_hour = (s = av_fetch(av, 2, 0)) ? SvIV(*s) : 0;
  229.     t->tm_mday = (s = av_fetch(av, 3, 0)) ? SvIV(*s) : 0;
  230.     t->tm_mon = (s = av_fetch(av, 4, 0)) ? SvIV(*s) : 0;
  231.     t->tm_year = (s = av_fetch(av, 5, 0)) ? SvIV(*s) : 0;
  232.     t->tm_wday= (s = av_fetch(av, 6, 0)) ? SvIV(*s) : 0;
  233.     t->tm_yday= (s = av_fetch(av, 7, 0)) ? SvIV(*s) : 0;
  234.     t->tm_isdst = (s = av_fetch(av, 8, 0)) ? SvIV(*s) : 0;
  235.     
  236.     return t;
  237. }
  238.  
  239. #ifndef newRV_noinc   
  240. static SV * rv;
  241. #define newRV_noinc(s) ((rv=newRV(s)), SvREFCNT_dec(s), rv)
  242. #endif
  243.  
  244. #if (PATCHLEVEL < 3) || ((PATCHLEVEL == 3) && (SUBVERSION < 16))
  245. #define sv_derived_from(x, y) sv_isobject((x))
  246. #endif
  247.  
  248. extern char * printlong _((unsigned long val));
  249. extern unsigned long makelong _((char * c));
  250. SV * newSVChar4 _((unsigned long arg));
  251. unsigned long SvChar4 _((SV *arg));
  252.  
  253. typedef struct {
  254.     int errno;
  255.     struct pi_file * pf;
  256.     SV * Class;
  257. } PDA__Pilot__File;
  258. typedef struct DLP {
  259.     int errno;
  260.     int socket;
  261. } PDA__Pilot__DLP;
  262. typedef struct DLPDB {
  263.     SV *    connection;
  264.     int    socket;
  265.     int    handle;
  266.     int errno;
  267.     SV * dbname;
  268.     int dbmode;
  269.     int dbcard;
  270.     SV * Class;
  271. } PDA__Pilot__DLP__DB;
  272.  
  273. /*typedef PDA__Pilot__DLP__DB PDA__Pilot__DLP__ResourceDB;
  274. typedef PDA__Pilot__DLP__DB PDA__Pilot__DLP__RecordDB;*/
  275. typedef struct DBInfo DBInfo;
  276. typedef struct PilotUser UserInfo;
  277. typedef unsigned long Char4;
  278. typedef int Result;
  279.  
  280. SV *
  281. newSVChar4(arg)
  282.     unsigned long arg;
  283. {
  284.     char * c = printlong(arg);
  285.     if(    (isalpha(c[0]) || (c[0] == ' ') || (c[0] == '_')) &&
  286.         (isalpha(c[1]) || (c[1] == ' ') || (c[0] == '_')) &&
  287.         (isalpha(c[2]) || (c[2] == ' ') || (c[0] == '_')) &&
  288.         (isalpha(c[3]) || (c[3] == ' ') || (c[0] == '_')))
  289.         return newSVpv(c,4);
  290.     else
  291.         return newSViv(arg);
  292. }
  293.  
  294. unsigned long
  295. SvChar4(arg)
  296.     SV * arg;
  297. {
  298.     if (SvIOKp(arg))
  299.         return SvIV(arg);
  300.     else {
  301.         STRLEN len;
  302.         char * c = SvPV(arg, len);
  303.         if (len != 4)
  304.             croak("Char4 argument a string that isn't four bytes long");
  305.         return makelong(c);
  306.     }
  307. }
  308.  
  309. #define pack_dbinfo(arg, var, failure)        \
  310.     {                                        \
  311.         if (failure < 0)  {                    \
  312.            arg = &sv_undef;                    \
  313.            self->errno = failure;            \
  314.         } else {                            \
  315.             HV * i = newHV();                                    \
  316.             hv_store(i, "more", 4, newSViv(var.more), 0);        \
  317.             hv_store(i, "flagReadOnly", 12, newSViv((var.flags & dlpDBFlagReadOnly)!=0), 0);        \
  318.             hv_store(i, "flagResource", 12, newSViv((var.flags & dlpDBFlagResource)!=0), 0);        \
  319.             hv_store(i, "flagBackup", 10, newSViv((var.flags & dlpDBFlagBackup)!=0), 0);            \
  320.             hv_store(i, "flagOpen", 8, newSViv((var.flags & dlpDBFlagOpen)!=0), 0);                    \
  321.             hv_store(i, "flagAppInfoDirty", 16, newSViv((var.flags & dlpDBFlagAppInfoDirty)!=0), 0);\
  322.             hv_store(i, "flagNewer", 9, newSViv((var.flags & dlpDBFlagNewer)!=0), 0);                \
  323.             hv_store(i, "flagReset", 9, newSViv((var.flags & dlpDBFlagReset)!=0), 0);                \
  324.             hv_store(i, "flagExcludeFromSync", 19, newSViv((var.miscFlags & dlpDBMiscFlagExcludeFromSync)!=0), 0);    \
  325.             hv_store(i, "type", 4, newSVChar4(var.type), 0);                \
  326.             hv_store(i, "creator", 7, newSVChar4(var.creator), 0);            \
  327.             hv_store(i, "version", 7, newSViv(var.version), 0);                \
  328.             hv_store(i, "modnum", 6, newSViv(var.modnum), 0);                \
  329.             hv_store(i, "index", 5, newSViv(var.index), 0);                    \
  330.             hv_store(i, "createDate", 10, newSViv(var.createDate), 0);        \
  331.             hv_store(i, "modifyDate", 10, newSViv(var.modifyDate), 0);        \
  332.             hv_store(i, "backupDate", 10, newSViv(var.backupDate), 0);        \
  333.             hv_store(i, "name", 4, newSVpv(var.name, 0), 0);                \
  334.             arg = newRV((SV*)i);                                            \
  335.         }    \
  336.     }
  337.  
  338. #define unpack_dbinfo(arg, var)                                        \
  339.     if ((SvTYPE(arg) == SVt_RV) && (SvTYPE(SvRV(arg))==SVt_PVHV)) {    \
  340.         HV * i = (HV*)SvRV(arg);                                    \
  341.         SV ** s;                                                    \
  342.         var.more = (s = hv_fetch(i, "more", 4, 0)) ? SvIV(*s) : 0;    \
  343.         var.flags =                                                 \
  344.             (((s = hv_fetch(i, "flagReadOnly", 12, 0)) && SvTRUE(*s)) ? dlpDBFlagReadOnly : 0)|        \
  345.             (((s = hv_fetch(i, "flagResource", 12, 0)) && SvTRUE(*s)) ? dlpDBFlagResource : 0)|        \
  346.             (((s = hv_fetch(i, "flagBackup", 10, 0)) && SvTRUE(*s)) ? dlpDBFlagBackup : 0)|            \
  347.             (((s = hv_fetch(i, "flagOpen", 8, 0)) && SvTRUE(*s)) ? dlpDBFlagOpen : 0)    |            \
  348.             (((s = hv_fetch(i, "flagAppInfoDirty", 16, 0)) && SvTRUE(*s)) ? dlpDBFlagAppInfoDirty : 0)    |\
  349.             (((s = hv_fetch(i, "flagNewer", 9, 0)) && SvTRUE(*s)) ? dlpDBFlagNewer : 0)    |            \
  350.             (((s = hv_fetch(i, "flagReset", 9, 0)) && SvTRUE(*s)) ? dlpDBFlagReset : 0) |        \
  351.             0;\
  352.         var.miscFlags = \
  353.              (((s = hv_fetch(i, "flagExcludeFromSync", 19, 0)) && SvTRUE(*s)) ? dlpDBMiscFlagExcludeFromSync : 0);    \
  354.         var.type = (s = hv_fetch(i, "type", 4, 0)) ? SvChar4(*s) : 0;    \
  355.         var.creator = (s = hv_fetch(i, "creator", 7, 0)) ? SvChar4(*s) : 0;    \
  356.         var.version = (s = hv_fetch(i, "version", 7, 0)) ? SvIV(*s) : 0;    \
  357.         var.modnum = (s = hv_fetch(i, "modnum", 6, 0)) ? SvIV(*s) : 0;    \
  358.         var.index = (s = hv_fetch(i, "index", 5, 0)) ? SvIV(*s) : 0;    \
  359.         var.createDate = (s = hv_fetch(i, "creatDate", 10, 0)) ? SvIV(*s) : 0;    \
  360.         var.modifyDate = (s = hv_fetch(i, "modifyDate", 10, 0)) ? SvIV(*s) : 0;    \
  361.         var.backupDate = (s = hv_fetch(i, "backupDate", 10, 0)) ? SvIV(*s) : 0;    \
  362.         if ((s = hv_fetch(i, "name", 4, 0)) ? SvPV(*s,na) : 0)    \
  363.             strcpy(var.name, SvPV(*s, na));    \
  364.     } else    {\
  365.         croak("argument is not a hash reference"); \
  366.     }
  367.  
  368. #define pack_userinfo(arg, var, failure)    \
  369.     {    \
  370.         if (failure < 0)  {    \
  371.            arg = &sv_undef;    \
  372.            self->errno = failure;\
  373.         } else {    \
  374.             HV * i = newHV();    \
  375.             hv_store(i, "userID", 6, newSViv(var.userID), 0);    \
  376.             hv_store(i, "viewerID", 8, newSViv(var.viewerID), 0);    \
  377.             hv_store(i, "lastSyncPC", 10, newSViv(var.lastSyncPC), 0);    \
  378.             hv_store(i, "successfulSyncDate", 18, newSViv(var.successfulSyncDate), 0);    \
  379.             hv_store(i, "lastSyncDate", 12, newSViv(var.lastSyncDate), 0);    \
  380.             hv_store(i, "name", 4, newSVpv(var.username,0), 0);    \
  381.             hv_store(i, "password", 8, newSVpv(var.password,var.passwordLength), 0);    \
  382.             arg = newRV((SV*)i);    \
  383.         }    \
  384.     }
  385.  
  386. #define unpack_userinfo(arg, var)    \
  387.     if ((SvTYPE(arg) == SVt_RV) && (SvTYPE(SvRV(arg))==SVt_PVHV)) {    \
  388.         HV * i = (HV*)SvRV(arg);    \
  389.         SV ** s;    \
  390.         var.userID = (s = hv_fetch(i, "userID", 6, 0)) ? SvIV(*s) : 0;    \
  391.         var.viewerID = (s = hv_fetch(i, "viewerID", 8, 0)) ? SvIV(*s) : 0;    \
  392.         var.lastSyncPC = (s = hv_fetch(i, "lastSyncPC", 10, 0)) ? SvIV(*s) : 0;    \
  393.         var.lastSyncDate = (s = hv_fetch(i, "lastSyncDate", 12, 0)) ? SvIV(*s) : 0;    \
  394.         var.successfulSyncDate = (s = hv_fetch(i, "successfulSyncDate", 18, 0)) ? SvIV(*s) : 0;    \
  395.         if ((s = hv_fetch(i, "name", 4, 0)) ? SvPV(*s,na) : 0)    \
  396.             strcpy(var.username, SvPV(*s, na));    \
  397.     } else    {\
  398.         croak("argument is not a hash reference"); \
  399.     }
  400.  
  401. #define PackAI                                                 \
  402.         {                                                    \
  403.             HV * h;                                            \
  404.             if (SvRV(data) &&                                 \
  405.                 (SvTYPE(h=(HV*)SvRV(data))==SVt_PVHV)) {    \
  406.                 int count;                                    \
  407.                 PUSHMARK(sp);                                \
  408.                   XPUSHs(data);                                \
  409.                 PUTBACK;                                    \
  410.                 count = perl_call_method("Pack", G_SCALAR);    \
  411.                 SPAGAIN;                                    \
  412.                 if (count != 1)                                \
  413.                     croak("Unable to pack app block");        \
  414.                 data = POPs;                                \
  415.                 PUTBACK;                                    \
  416.             }                                                \
  417.             else {                                            \
  418.                     croak("Unable to pack app block");        \
  419.             }                                                \
  420.         }
  421.  
  422. #define ReturnReadAI(buf,size)                                     \
  423.         if (result >=0) {                                        \
  424.             if (self->Class) {                                    \
  425.                 int count;                                        \
  426.                 PUSHMARK(sp);                                    \
  427.                 XPUSHs(self->Class);                            \
  428.                 XPUSHs(newSVpv(buf, size));                        \
  429.                 PUTBACK;                                        \
  430.                 count = perl_call_method("appblock", G_SCALAR);    \
  431.                 SPAGAIN;                                        \
  432.                 if (count != 1)                                    \
  433.                     croak("Unable to create appblock");            \
  434.             }                                                    \
  435.             else {                                                \
  436.                 croak("Class not defined");                        \
  437.             }                                                    \
  438.         } else {                                                \
  439.             self->errno = result;                                \
  440.             PUSHs(&sv_undef);                                    \
  441.         }
  442.  
  443. #define PackSI                                                 \
  444.         {                                                    \
  445.             HV * h;                                            \
  446.             if (SvRV(data) &&                                 \
  447.                 (SvTYPE(h=(HV*)SvRV(data))==SVt_PVHV)) {    \
  448.                 int count;                                    \
  449.                 PUSHMARK(sp);                                \
  450.                   XPUSHs(data);                                \
  451.                 PUTBACK;                                    \
  452.                 count = perl_call_method("Pack", G_SCALAR);    \
  453.                 SPAGAIN;                                    \
  454.                 if (count != 1)                                \
  455.                     croak("Unable to pack sort block");        \
  456.                 data = POPs;                                \
  457.                 PUTBACK;                                    \
  458.             }                                                \
  459.             else {                                            \
  460.                     croak("Unable to pack sort block");        \
  461.             }                                                \
  462.         }
  463.  
  464. #define ReturnReadSI(buf,size)                                     \
  465.         if (result >=0) {                                        \
  466.             if (self->Class) {                                    \
  467.                 int count;                                        \
  468.                 PUSHMARK(sp);                                    \
  469.                 XPUSHs(self->Class);                            \
  470.                 XPUSHs(newSVpv(buf, size));                        \
  471.                 PUTBACK;                                        \
  472.                 count = perl_call_method("sortblock", G_SCALAR);\
  473.                 SPAGAIN;                                        \
  474.                 if (count != 1)                                    \
  475.                     croak("Unable to create sortblock");        \
  476.             }                                                    \
  477.             else {                                                \
  478.                 croak("Class not defined");                        \
  479.             }                                                    \
  480.         } else {                                                \
  481.             self->errno = result;                                \
  482.             PUSHs(&sv_undef);                                    \
  483.         }
  484.  
  485. #define PackRecord                                             \
  486.         {                                                    \
  487.             HV * h;                                            \
  488.             if (SvRV(data) &&                                 \
  489.                 (SvTYPE(h=(HV*)SvRV(data))==SVt_PVHV)) {    \
  490.                 int count;                                    \
  491.                 SV ** s;                                    \
  492.                 if (!(s = hv_fetch(h, "id", 2, 0)) || !SvOK(*s))    \
  493.                     croak("record must contain id");        \
  494.                 id = SvIV(*s);                                \
  495.                 attr = 0;                                    \
  496.                 if (!(s = hv_fetch(h, "secret", 6, 0)) || !SvOK(*s))\
  497.                     croak("record must contain secret");            \
  498.                 attr |= SvIV(*s) ? dlpRecAttrSecret : 0;            \
  499.                 if (!(s = hv_fetch(h, "deleted", 7, 0)) || !SvOK(*s))    \
  500.                     croak("record must contain deleted");            \
  501.                 attr |= SvIV(*s) ? dlpRecAttrDeleted : 0;            \
  502.                 if (!(s = hv_fetch(h, "modified", 8, 0)) || !SvOK(*s))    \
  503.                     croak("record must contain deleted");            \
  504.                 attr |= SvIV(*s) ? dlpRecAttrDirty : 0;                \
  505.                 if (!(s = hv_fetch(h, "busy", 4, 0)) || !SvOK(*s))    \
  506.                     croak("record must contain deleted");            \
  507.                 attr |= SvIV(*s) ? dlpRecAttrBusy : 0;                \
  508.                 if (!(s = hv_fetch(h, "archived", 8, 0)) || !SvOK(*s))    \
  509.                     croak("record must contain deleted");            \
  510.                 attr |= SvIV(*s) ? dlpRecAttrArchived : 0;            \
  511.                 if (!(s = hv_fetch(h, "category", 8, 0)) || !SvOK(*s))    \
  512.                     croak("record must contain category");    \
  513.                 category = SvIV(*s);                        \
  514.                 PUSHMARK(sp);                                \
  515.                   XPUSHs(data);                                \
  516.                 PUTBACK;                                    \
  517.                 count = perl_call_method("Pack", G_SCALAR);    \
  518.                 SPAGAIN;                                    \
  519.                 if (count != 1)                                \
  520.                     croak("Unable to pack record");            \
  521.                 data = POPs;                                \
  522.                 PUTBACK;                                    \
  523.             }                                                \
  524.             else {                                            \
  525.                     croak("Unable to pack record");            \
  526.             }                                                \
  527.         }
  528.  
  529. #define PackRaw                                                \
  530.         {                                                    \
  531.             HV * h;                                            \
  532.             if (SvRV(data) &&                                 \
  533.                 (SvTYPE(h=(HV*)SvRV(data))==SVt_PVHV)) {    \
  534.                 int count;                                    \
  535.                 PUSHMARK(sp);                                \
  536.                   XPUSHs(data);                                \
  537.                 PUTBACK;                                    \
  538.                 count = perl_call_method("Raw", G_SCALAR);    \
  539.                 SPAGAIN;                                    \
  540.                 if (count != 1)    {                            \
  541.                     SV ** s = hv_fetch(h, "raw", 3, 0);        \
  542.                     if (s)                                    \
  543.                         data = *s;                            \
  544.                 } else {                                    \
  545.                     data = POPs;                            \
  546.                     PUTBACK;                                \
  547.                 }                                            \
  548.             }                                                \
  549.         }
  550.  
  551. #define ReturnReadRecord(buf,size)                                 \
  552.         if (result >=0) {                                        \
  553.             if (self->Class) {                                    \
  554.                 int count;                                        \
  555.                 SV * ret;                                        \
  556.                 PUSHMARK(sp);                                    \
  557.                 XPUSHs(self->Class);                            \
  558.                 XPUSHs(newSVpv(buf, size));                        \
  559.                 XPUSHs(sv_2mortal(newSViv(id)));                \
  560.                 XPUSHs(sv_2mortal(newSViv(attr)));                \
  561.                 XPUSHs(sv_2mortal(newSViv(category)));            \
  562.                 XPUSHs(sv_2mortal(newSViv(index)));                \
  563.                 PUTBACK;                                        \
  564.                 count = perl_call_method("record", G_SCALAR);    \
  565.                 SPAGAIN;                                        \
  566.                 if (count != 1)                                    \
  567.                     croak("Unable to create record");            \
  568.                 ret = POPs;                                        \
  569.                 PUTBACK;                                        \
  570.                 PUSHs(ret);                                        \
  571.             }                                                    \
  572.             else {                                                \
  573.                 croak("Class not defined");                        \
  574.             }                                                    \
  575.         } else {                                                \
  576.             self->errno = result;                                \
  577.             PUSHs(&sv_undef);                                    \
  578.         }
  579.  
  580. #define PackResource                                             \
  581.         {                                                        \
  582.             HV * h;                                                \
  583.             if (SvRV(data) &&                                     \
  584.                 (SvTYPE(h=(HV*)SvRV(data))==SVt_PVHV)) {        \
  585.                 int count;                                        \
  586.                 SV ** s;                                        \
  587.                 if (!(s = hv_fetch(h, "id", 2, 0)) || !SvOK(*s))\
  588.                     croak("record must contain id");            \
  589.                 id = SvIV(*s);                                    \
  590.                 if (!(s = hv_fetch(h, "type", 4, 0)) || !SvOK(*s))    \
  591.                     croak("record must contain type");            \
  592.                 type = SvChar4(*s);                                \
  593.                 PUSHMARK(sp);                                    \
  594.                   XPUSHs(data);                                    \
  595.                 PUTBACK;                                        \
  596.                 count = perl_call_method("Pack", G_SCALAR);        \
  597.                 SPAGAIN;                                        \
  598.                 if (count != 1)                                    \
  599.                     croak("Unable to pack resource");            \
  600.                 data = POPs;                                    \
  601.                 PUTBACK;                                        \
  602.             }                                                    \
  603.             else {                                                \
  604.                     croak("Unable to pack resource");            \
  605.             }                                                    \
  606.         }
  607.  
  608. #define ReturnReadResource(buf,size)                             \
  609.         if (result >=0) {                                        \
  610.             if (self->Class) {                                    \
  611.                 int count;                                        \
  612.                 PUSHMARK(sp);                                    \
  613.                 XPUSHs(self->Class);                            \
  614.                 XPUSHs(newSVpv(buf, size));                        \
  615.                 XPUSHs(sv_2mortal(newSVChar4(type)));            \
  616.                 XPUSHs(sv_2mortal(newSViv(id)));                \
  617.                 XPUSHs(sv_2mortal(newSViv(index)));                \
  618.                 PUTBACK;                                        \
  619.                 count = perl_call_method("resource", G_SCALAR);    \
  620.                 SPAGAIN;                                        \
  621.                 if (count != 1)                                    \
  622.                     croak("Unable to create resource");            \
  623.             }                                                    \
  624.             else {                                                \
  625.                 croak("Class not defined");                        \
  626.             }                                                    \
  627.         } else {                                                \
  628.             self->errno = result;                                \
  629.             PUSHs(&sv_undef);                                    \
  630.         }
  631.  
  632. #define PackPref                                                 \
  633.         {                                                        \
  634.             HV * h;                                                \
  635.             if (SvRV(data) &&                                     \
  636.                 (SvTYPE(h=(HV*)SvRV(data))==SVt_PVHV)) {        \
  637.                 int count;                                        \
  638.                 SV ** s;                                        \
  639.                 if (!(s = hv_fetch(h, "id", 2, 0)) || !SvOK(*s))\
  640.                     croak("record must contain id");            \
  641.                 id = SvIV(*s);                                    \
  642.                 if (!(s = hv_fetch(h, "creator", 7, 0)) || !SvOK(*s))    \
  643.                     croak("record must contain type");            \
  644.                 creator = SvChar4(*s);                            \
  645.                 if (!(s = hv_fetch(h, "version", 7, 0)) || !SvOK(*s))    \
  646.                     croak("record must contain type");            \
  647.                 version = SvIV(*s);                                \
  648.                 if (!(s = hv_fetch(h, "backup", 6, 0)) || !SvOK(*s))    \
  649.                     croak("record must contain type");            \
  650.                 backup = SvIV(*s);                                \
  651.                    PUSHMARK(sp);                                    \
  652.                   XPUSHs(data);                                    \
  653.                 PUTBACK;                                        \
  654.                 count = perl_call_method("Pack", G_SCALAR);        \
  655.                 SPAGAIN;                                        \
  656.                 if (count != 1)                                    \
  657.                     croak("Unable to pack resource");            \
  658.                 data = POPs;                                    \
  659.                 PUTBACK;                                        \
  660.             }                                                    \
  661.             else {                                                \
  662.                     croak("Unable to pack resource");            \
  663.             }                                                    \
  664.         }
  665.  
  666. #define ReturnReadPref(buf,size)                                 \
  667.         if (result >=0) {                                        \
  668.             HV * h = perl_get_hv("PDA::Pilot::PrefClasses", 0);    \
  669.             SV ** s;                                            \
  670.             int count;                                            \
  671.             if (!h)                                                \
  672.                 croak("PrefClasses doesn't exist");                \
  673.             s = hv_fetch(h, printlong(creator), 4, 0);            \
  674.             if (!s)                                                \
  675.                 s = hv_fetch(h, "", 0, 0);                        \
  676.             if (!s)                                                \
  677.                 croak("Default PrefClass not defined");            \
  678.             PUSHMARK(sp);                                        \
  679.             XPUSHs(newSVsv(*s));                                \
  680.             XPUSHs(newSVpv(buf, size));                            \
  681.             XPUSHs(sv_2mortal(newSVChar4(creator)));            \
  682.             XPUSHs(sv_2mortal(newSViv(id)));                    \
  683.             XPUSHs(sv_2mortal(newSViv(version)));                \
  684.             XPUSHs(sv_2mortal(newSViv(backup)));                \
  685.             PUTBACK;                                            \
  686.             count = perl_call_method("pref", G_SCALAR);            \
  687.             SPAGAIN;                                            \
  688.             if (count != 1)                                        \
  689.                 croak("Unable to create resource");                \
  690.         } else {                                                \
  691.             self->errno = result;                                \
  692.             PUSHs(&sv_undef);                                    \
  693.         }
  694.  
  695. void doUnpackCategory(HV * self, struct CategoryAppInfo * c)
  696. {
  697.     AV * e = newAV();
  698.     int i;
  699.     
  700.     hv_store(self, "categoryRenamed", 15, newRV_noinc((SV*)e), 0);
  701.  
  702.     for (i=0;i<16;i++) {
  703.         av_push(e, newSViv(c->renamed[i]));
  704.     }
  705.  
  706.     e = newAV();
  707.     hv_store(self, "categoryName", 12, newRV_noinc((SV*)e), 0);
  708.     
  709.     for (i=0;i<16;i++) {
  710.         av_push(e, newSVpv(c->name[i], 0));
  711.     }
  712.  
  713.     e = newAV();
  714.     hv_store(self, "categoryID", 10, newRV_noinc((SV*)e), 0);
  715.     
  716.     for (i=0;i<16;i++) {
  717.         av_push(e, newSViv(c->ID[i]));
  718.     }
  719.  
  720.     hv_store(self, "categoryLastUniqueID", 20, newSViv(c->lastUniqueID), 0);
  721. }
  722.  
  723.  
  724. void doPackCategory(HV * self, struct CategoryAppInfo * c)
  725. {
  726.     SV ** s;
  727.     AV * av;
  728.     int i;
  729.     
  730.     if ((s = hv_fetch(self, "categoryName", 12, 0)) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV))
  731.         for (i=0;i<16;i++)
  732.             strncpy(c->name[i], (s=av_fetch(av, i, 0)) ? SvPV(*s,na) : "", 16);
  733.     else
  734.         for (i=0;i<16;i++)
  735.             strcpy(c->name[i], "");
  736.  
  737.     for (i=0;i<16;i++)
  738.         c->name[i][15] = '\0';
  739.  
  740.     if ((s = hv_fetch(self, "categoryID", 10, 0)) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV))
  741.         for (i=0;i<16;i++)
  742.             c->ID[i] = (s=av_fetch(av, i, 0)) ? SvIV(*s) : 0;
  743.     else
  744.         for (i=0;i<16;i++)
  745.             c->ID[i] = 0;
  746.  
  747.     if ((s = hv_fetch(self, "categoryRenamed", 10, 0)) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV))
  748.         for (i=0;i<16;i++)
  749.             c->renamed[i] = (s=av_fetch(av, i, 0)) ? SvIV(*s) : 0;
  750.     else
  751.         for (i=0;i<16;i++)
  752.             c->renamed[i] = 0;
  753. }
  754.  
  755. int SvList(SV * arg, char **list)
  756. {
  757.     int i;
  758.     char * str = SvPV(arg, na);
  759.     for (i=0;list[i];i++)
  760.         if (strcasecmp(list[i], str)==0)
  761.             return i;
  762.     if (SvPOKp(arg)) {
  763.         croak("Invalid value");
  764.     }
  765.     return SvIV(arg);
  766. }
  767.  
  768. SV * newSVlist(int value, char **list)
  769. {
  770.     int i;
  771.     for (i=0;list[i];i++)
  772.         ;
  773.     if (value < i)
  774.         return newSVpv(list[value], 0);
  775.     else
  776.         return newSViv(value);
  777. }
  778.  
  779. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot
  780.  
  781. double
  782. constant(name,arg)
  783.     char *        name
  784.     int        arg
  785.  
  786. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot::Appointment
  787.  
  788. SV *
  789. Unpack(record)
  790.     SV * record
  791.     CODE:
  792.     {
  793.     STRLEN len;
  794.     int i;
  795.     AV * e;
  796.     HV * ret, *h;
  797.     struct Appointment a;
  798.     
  799.     if (SvRV(record)) {
  800.         SV ** raw;
  801.         ret = (HV*)SvRV(record);
  802.         raw = hv_fetch(ret, "raw", 3, 0);
  803.         if (raw) {
  804.             (void)SvPV(*raw, len);
  805.             unpack_Appointment(&a, SvPV(*raw, na), len);
  806.         } else {
  807.             croak("Unable to unpack appointment");
  808.         }
  809.         RETVAL = SvREFCNT_inc(record);
  810.     } else {
  811.         ret = newHV();
  812.         SvREFCNT_inc(record);
  813.         hv_store(ret, "raw", 3, record, 0);
  814.         (void)SvPV(record, len);
  815.         unpack_Appointment(&a, SvPV(record, len), len);
  816.         RETVAL = newRV_noinc((SV*)ret);
  817.     }
  818.     /*(void)SvPV(record, len);
  819.     unpack_Appointment(&a, (unsigned char*)SvPV(record, len), len);
  820.     ret = newHV();
  821.     RETVAL = newRV_noinc((SV*)ret);*/
  822.     
  823.     hv_store(ret, "event", 5, newSViv(a.event), 0);
  824.     hv_store(ret, "begin", 5, newRV_noinc((SV*)tmtoav(&a.begin)), 0);
  825.     
  826.     if (!a.event) {
  827.         hv_store(ret, "end", 3, newRV_noinc((SV*)tmtoav(&a.end)), 0);
  828.     }
  829.     
  830.     if (a.alarm) {
  831.         HV * alarm = newHV();
  832.         hv_store(ret, "alarm", 5, newRV_noinc((SV*)alarm), 0);
  833.         
  834.            hv_store(alarm, "advance", 7, newSViv(a.advance), 0);
  835.         hv_store(alarm, "units", 5, newSViv(
  836.             (a.advanceUnits == 0) ? (60) :        /* Minutes */
  837.             (a.advanceUnits == 1) ? (60*60) :     /* Hours */
  838.             (a.advanceUnits == 2) ? (60*60*24) :  /* Days */
  839.             0), 0);
  840.         if (a.advanceUnits > 2) {
  841.             warn("Invalid advance unit %d encountered", a.advanceUnits);
  842.         }
  843.     }
  844.     if (a.repeatType) {
  845.         HV * repeat = newHV();
  846.         hv_store(ret, "repeat", 6, newRV_noinc((SV*)repeat), 0);
  847.         
  848.            hv_store(repeat, "type", 4, newSVpv(DatebookRepeatTypeNames[a.repeatType],0), 0);
  849.            hv_store(repeat, "frequency", 9, newSViv(a.repeatFrequency), 0);
  850.            if (a.repeatType == repeatMonthlyByDay)
  851.                hv_store(repeat, "day", 3, newSViv(a.repeatDay), 0);
  852.            else if (a.repeatType == repeatWeekly) {
  853.             e = newAV();
  854.             hv_store(repeat, "days", 4, newRV_noinc((SV*)e), 0);
  855.             for (i=0;i<7;i++)
  856.                 av_push(e,newRV_noinc(newSViv(a.repeatDays[i])));
  857.            }
  858.            hv_store(repeat, "weekstart", 9, newSViv(a.repeatWeekstart), 0);
  859.            if (!a.repeatForever)
  860.                hv_store(repeat, "end", 3, newRV_noinc((SV*)tmtoav(&a.repeatEnd)),0);
  861.     }
  862.     
  863.     if (a.exceptions) {
  864.         e = newAV();
  865.         hv_store(ret, "exceptions", 10, newRV_noinc((SV*)e), 0);
  866.         for (i=0;i<a.exceptions;i++) {
  867.             av_push(e,newRV_noinc((SV*)tmtoav(&a.exception[i])));
  868.         }
  869.     }
  870.     
  871.     if (a.description)
  872.       hv_store(ret, "description", 11, newSVpv((char*)a.description,0), 0);
  873.  
  874.     if (a.note)
  875.       hv_store(ret, "note", 4, newSVpv((char*)a.note,0), 0);
  876.     
  877.     free_Appointment(&a);
  878.     
  879.     }
  880.     OUTPUT:
  881.     RETVAL
  882.  
  883. SV *
  884. Pack(record)
  885.     SV * record
  886.     CODE:
  887.     {
  888.     int len;
  889.     SV ** s;
  890.     HV * h;
  891.     long advance;
  892.     struct Appointment a;
  893.     
  894.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  895.         RETVAL = record;
  896.     else {
  897.  
  898.     a.event = (s = hv_fetch(h, "event", 5, 0)) ? SvIV(*s) : 0;
  899.     if (s= hv_fetch(h, "begin", 5, 0)) 
  900.         avtotm((AV*)SvRV(*s), &a.begin);
  901.     else {
  902.       memset(&a.begin, '\0', sizeof(struct tm));
  903.       croak("appointments must contain a begin date");
  904.     }
  905.     if (s= hv_fetch(h, "end", 3, 0)) 
  906.         avtotm((AV*)SvRV(*s), &a.end);
  907.     else
  908.         memset(&a.end, '\0', sizeof(struct tm));
  909.  
  910.     if ((s = hv_fetch(h, "alarm", 5, 0)) && SvRV(*s) && (SvTYPE(SvRV(*s))==SVt_PVHV)) {
  911.         HV * h2 = (HV*)SvRV(*s);
  912.         I32 u;
  913.         a.advance = (s = hv_fetch(h2, "advance", 7, 0)) ? SvIV(*s) : 0;
  914.         u = (s = hv_fetch(h2, "units", 5, 0)) ? SvIV(*s) : 0;
  915.         switch (u) {
  916.         case 60:
  917.             u = 0;
  918.             break;
  919.         case 60*60:
  920.             u = 1;
  921.             break;
  922.         case 60*60*24:
  923.             u = 2;
  924.             break;
  925.         default:
  926.             if (strEQ(SvPV(*s, na), "minutes"))
  927.                 u = 0;
  928.             else if (strEQ(SvPV(*s, na), "hours"))
  929.                 u = 1;
  930.             else if (strEQ(SvPV(*s, na), "days"))
  931.                 u = 2;
  932.             else
  933.                 croak("Invalid advance unit %d encountered", u);
  934.         }
  935.         a.advanceUnits = u;
  936.         if (a.advance > 254)
  937.             warn("Alarm advance value %d out of range", a.advance);
  938.         a.alarm = 1;
  939.     } else {
  940.         a.alarm = 0;
  941.         a.advance = 0;
  942.         a.advanceUnits = 0;
  943.     }        
  944.  
  945.  
  946.     if ((s = hv_fetch(h, "repeat", 6, 0)) && SvRV(*s) && (SvTYPE(SvRV(*s))==SVt_PVHV)) {
  947.         HV * h2 = (HV*)SvRV(*s);
  948.         int i;
  949.         a.repeatType = (s = hv_fetch(h2, "type", 4, 0)) ? SvList(*s, DatebookRepeatTypeNames) : 0;
  950.         a.repeatFrequency = (s = hv_fetch(h2, "frequency", 9, 0)) ? SvIV(*s) : 0;
  951.         a.repeatDay = 0;
  952.         for(i=0;i<7;i++)
  953.             a.repeatDays[i] = 0;
  954.         if (a.repeatType == repeatMonthlyByDay ) {
  955.             a.repeatDay = (s = hv_fetch(h2, "day", 3, 0)) ? SvIV(*s) : 0;
  956.         } else if (a.repeatType == repeatWeekly) {
  957.             if ((s = hv_fetch(h, "days", 4, 0)) && SvRV(*s) && (SvTYPE(SvRV(*s))==SVt_PVAV)) {
  958.                 int i;
  959.                 AV * a2 = (AV*)SvRV(*s);
  960.                 for (i=0;i<7;i++)
  961.                     if ((s = av_fetch(a2, i, 0)))
  962.                         a.repeatDays[i] = SvIV(*s);
  963.             }
  964.         }
  965.         a.repeatWeekstart = (s = hv_fetch(h2, "weekstart", 9, 0)) ? SvIV(*s) : 0;
  966.         if (s = hv_fetch(h2, "end", 3, 0))  {
  967.             avtotm((AV*)SvRV(*s), &a.repeatEnd);
  968.             a.repeatForever = 0;
  969.         } else {
  970.             a.repeatForever = 1;
  971.         }
  972.     } else {
  973.         a.repeatType = 0;
  974.         a.repeatForever = 0;
  975.         a.repeatFrequency = 0;
  976.         a.repeatDay = 0;
  977.         a.repeatWeekstart = 0;
  978.         memset(&a.repeatEnd,'\0', sizeof(struct tm));
  979.     }        
  980.  
  981.     if ((s = hv_fetch(h, "exceptions", 10, 0)) && SvRV(*s) && (SvTYPE(SvRV(*s))==SVt_PVAV)) {
  982.         int i;
  983.         AV * a2 = (AV*)SvRV(*s);
  984.         a.exceptions = av_len(a2);
  985.         a.exception = malloc(sizeof(struct tm)*a.exceptions);
  986.         for (i=0;i<a.exceptions;i++)
  987.             if ((s = av_fetch(a2, i, 0)))
  988.                 avtotm((AV*)SvRV(*s), a.exception+i);
  989.     } else {
  990.         a.exceptions = 0;
  991.         a.exception = 0;
  992.     }        
  993.  
  994.     a.description = (s = hv_fetch(h, "description", 11, 0)) ? SvPV(*s,na) : 0;
  995.     if (!a.description)
  996.       croak("appointments must contain a description");
  997.     a.note = (s = hv_fetch(h, "note", 4, 0)) ? SvPV(*s,na) : 0;
  998.  
  999.     len = pack_Appointment(&a, (unsigned char*)mybuf, 0xffff);
  1000.     
  1001.     if (a.exception)
  1002.         free(a.exception);
  1003.     
  1004.     RETVAL = newSVpv(mybuf, len);
  1005.  
  1006.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  1007.     }
  1008.     }
  1009.     OUTPUT:
  1010.     RETVAL
  1011.  
  1012.  
  1013. SV *
  1014. UnpackAppBlock(record)
  1015.     SV * record
  1016.     CODE:
  1017.     {
  1018.     STRLEN len;
  1019.     AV * e;
  1020.     HV * ret;
  1021.     int i;
  1022.     struct AppointmentAppInfo a;
  1023.  
  1024.     if (SvRV(record)) {
  1025.         SV ** raw;
  1026.         ret = (HV*)SvRV(record);
  1027.         raw = hv_fetch(ret, "raw", 3, 0);
  1028.         if (raw) {
  1029.             (void)SvPV(*raw, len);
  1030.             unpack_AppointmentAppInfo(&a, (unsigned char*)SvPV(*raw, na), len);
  1031.         } else {
  1032.             croak("Unable to unpack appointment app block");
  1033.         }
  1034.         RETVAL = SvREFCNT_inc(record);
  1035.     } else {
  1036.         ret = newHV();
  1037.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  1038.         (void)SvPV(record, len);
  1039.         unpack_AppointmentAppInfo(&a, (unsigned char*)SvPV(record, na), len);
  1040.         RETVAL = newRV_noinc((SV*)ret);
  1041.     }
  1042.     /*(void)SvPV(record, len);
  1043.     unpack_AppointmentAppInfo(&a, (unsigned char*)SvPV(record, na), len);
  1044.     ret = newHV();
  1045.     RETVAL = newRV_noinc((SV*)ret);*/
  1046.  
  1047.     doUnpackCategory(ret, &a.category);
  1048.     
  1049.     hv_store(ret, "startOfWeek", 11, newSViv(a.startOfWeek), 0);
  1050.     printf("startOfWeek = %d\n", a.startOfWeek);
  1051.  
  1052.     }
  1053.     OUTPUT:
  1054.     RETVAL
  1055.  
  1056. SV *
  1057. PackAppBlock(record)
  1058.     SV * record
  1059.     CODE:
  1060.     {
  1061.     int i;
  1062.     int len;
  1063.     SV ** s;
  1064.     HV * h;
  1065.     AV * av;
  1066.     struct AppointmentAppInfo a;
  1067.     
  1068.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  1069.         RETVAL = record;
  1070.     else {
  1071.     
  1072.     doPackCategory(h, &a.category);
  1073.  
  1074.     if ((s = hv_fetch(h, "startOfWeek", 11, 0)))
  1075.         a.startOfWeek = SvIV(*s);
  1076.     else
  1077.         a.startOfWeek = 0;
  1078.  
  1079.     len = pack_AppointmentAppInfo(&a, (unsigned char*)mybuf, 0xffff);
  1080.  
  1081.     RETVAL = newSVpv(mybuf, len);
  1082.  
  1083.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  1084.     }
  1085.     }
  1086.     OUTPUT:
  1087.     RETVAL
  1088.  
  1089. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot::ToDo
  1090.  
  1091. SV *
  1092. Unpack(record)
  1093.     SV * record
  1094.     CODE:
  1095.     {
  1096.     STRLEN len;
  1097.     int i;
  1098.     AV * e;
  1099.     HV * ret;
  1100.     struct ToDo a;
  1101.  
  1102.     if (SvRV(record)) {
  1103.         SV ** raw;
  1104.         ret = (HV*)SvRV(record);
  1105.         raw = hv_fetch(ret, "raw", 3, 0);
  1106.         if (raw) {
  1107.             (void)SvPV(*raw, len);
  1108.             unpack_ToDo(&a, (unsigned char*)SvPV(*raw, na), len);
  1109.         } else {
  1110.             croak("Unable to unpack todo");
  1111.         }
  1112.         RETVAL = SvREFCNT_inc(record);
  1113.     } else {
  1114.         ret = newHV();
  1115.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  1116.         (void)SvPV(record, len);
  1117.         unpack_ToDo(&a, (unsigned char*)SvPV(record, na), len);
  1118.         RETVAL = newRV_noinc((SV*)ret);
  1119.     }
  1120.     /*(void)SvPV(record, len);
  1121.     unpack_ToDo(&a, (unsigned char*)SvPV(record, na), len);
  1122.     ret = newHV();
  1123.     RETVAL = newRV_noinc((SV*)ret);*/
  1124.  
  1125.     if (!a.indefinite)
  1126.       hv_store(ret, "due", 3, newRV_noinc((SV*)tmtoav(&a.due)), 0);  
  1127.     hv_store(ret, "priority", 8, newSViv(a.priority), 0);
  1128.     hv_store(ret, "complete", 8, newSViv(a.complete), 0);
  1129.     if (a.description)
  1130.       hv_store(ret, "description", 11, newSVpv((char*)a.description,0), 0);
  1131.     if (a.note)
  1132.       hv_store(ret, "note", 4, newSVpv((char*)a.note,0), 0);
  1133.     
  1134.     free_ToDo(&a);
  1135.     
  1136.     }
  1137.     OUTPUT:
  1138.     RETVAL
  1139.  
  1140. SV *
  1141. Pack(record)
  1142.     SV * record
  1143.     CODE:
  1144.     {
  1145.     int len;
  1146.     SV ** s;
  1147.     HV * h;
  1148.     struct ToDo a;
  1149.  
  1150.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  1151.         RETVAL = record;
  1152.      else {
  1153.  
  1154.     a.priority = (s = hv_fetch(h, "priority", 8, 0)) ? SvIV(*s) : 0;
  1155.     a.complete = (s = hv_fetch(h, "complete", 8, 0)) ? SvIV(*s) : 0;
  1156.     if ((s = hv_fetch(h, "due", 3, 0))) {
  1157.         avtotm((AV*)SvRV(*s), &a.due);
  1158.         a.indefinite = 0;
  1159.     }
  1160.     else {
  1161.         memset(&a.due,'\0', sizeof(struct tm));
  1162.         a.indefinite = 1;
  1163.     }
  1164.     
  1165.     a.description = (s = hv_fetch(h, "description", 11, 0)) ? SvPV(*s,na) : 0;
  1166.     a.note = (s = hv_fetch(h, "note", 4, 0)) ? SvPV(*s,na) : 0;
  1167.  
  1168.     len = pack_ToDo(&a, (unsigned char*)mybuf, 0xffff);
  1169.     
  1170.     RETVAL = newSVpv(mybuf, len);
  1171.  
  1172.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  1173.     }
  1174.     }
  1175.     OUTPUT:
  1176.     RETVAL
  1177.  
  1178.  
  1179. SV *
  1180. UnpackAppBlock(record)
  1181.     SV * record
  1182.     CODE:
  1183.     {
  1184.     STRLEN len;
  1185.     AV * e;
  1186.     HV * ret;
  1187.     int i;
  1188.     struct ToDoAppInfo a;
  1189.  
  1190.     if (SvRV(record)) {
  1191.         SV ** raw;
  1192.         ret = (HV*)SvRV(record);
  1193.         raw = hv_fetch(ret, "raw", 3, 0);
  1194.         if (raw) {
  1195.             (void)SvPV(*raw, len);
  1196.             unpack_ToDoAppInfo(&a, (unsigned char*)SvPV(*raw, na), len);
  1197.         } else {
  1198.             croak("Unable to unpack todo app block");
  1199.         }
  1200.         RETVAL = SvREFCNT_inc(record);
  1201.     } else {
  1202.         ret = newHV();
  1203.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  1204.         (void)SvPV(record, len);
  1205.         unpack_ToDoAppInfo(&a, SvPV(record, na), len);
  1206.         RETVAL = newRV_noinc((SV*)ret);
  1207.     }
  1208.     /*(void)SvPV(record, len);
  1209.     unpack_ToDoAppInfo(&a, (unsigned char*)SvPV(record, na), len);
  1210.     ret = newHV();
  1211.     RETVAL = newRV_noinc((SV*)ret);*/
  1212.  
  1213.     doUnpackCategory(ret, &a.category);
  1214.  
  1215.     hv_store(ret, "dirty", 5, newSViv(a.dirty), 0);
  1216.  
  1217.     hv_store(ret, "sortByPriority", 14, newSViv(a.sortByPriority), 0);
  1218.  
  1219.     }
  1220.     OUTPUT:
  1221.     RETVAL
  1222.  
  1223. SV *
  1224. PackAppBlock(record)
  1225.     SV * record
  1226.     CODE:
  1227.     {
  1228.     int i;
  1229.     int len;
  1230.     SV ** s;
  1231.     HV * h;
  1232.     AV * av;
  1233.     struct ToDoAppInfo a;
  1234.     
  1235.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  1236.         RETVAL = record;
  1237.     else {
  1238.  
  1239.     doUnpackCategory(h, &a.category);
  1240.     
  1241.  
  1242.     doPackCategory(h, &a.category);
  1243.  
  1244.     a.dirty = (s = hv_fetch(h, "dirty", 5, 0)) ? SvIV(*s) : 0;
  1245.     a.sortByPriority = (s = hv_fetch(h, "sortByPriority", 14, 0)) ? SvIV(*s) : 0;
  1246.  
  1247.     len = pack_ToDoAppInfo(&a, (unsigned char*)mybuf, 0xffff);
  1248.  
  1249.     RETVAL = newSVpv(mybuf, len);
  1250.  
  1251.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  1252.     }
  1253.     }
  1254.     OUTPUT:
  1255.     RETVAL
  1256.  
  1257. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot::Address
  1258.  
  1259. SV *
  1260. Unpack(record)
  1261.     SV * record
  1262.     CODE:
  1263.     {
  1264.     STRLEN len;
  1265.     int i;
  1266.     AV * e;
  1267.     HV * ret;
  1268.     struct Address a;
  1269.  
  1270.     if (SvRV(record)) {
  1271.         SV ** raw;
  1272.         ret = (HV*)SvRV(record);
  1273.         raw = hv_fetch(ret, "raw", 3, 0);
  1274.         if (raw) {
  1275.             (void)SvPV(*raw, len);
  1276.             unpack_Address(&a, SvPV(*raw, na), len);
  1277.         } else {
  1278.             croak("Unable to unpack address");
  1279.         }
  1280.         RETVAL = SvREFCNT_inc(record);
  1281.     } else {
  1282.         ret = newHV();
  1283.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  1284.         (void)SvPV(record, len);
  1285.         unpack_Address(&a, SvPV(record, na), len);
  1286.         RETVAL = newRV_noinc((SV*)ret);
  1287.     }
  1288.     /*(void)SvPV(record, len);
  1289.     unpack_Address(&a, (unsigned char*)SvPV(record, na), len);
  1290.     ret = newHV();
  1291.     RETVAL = newRV_noinc((SV*)ret);*/
  1292.  
  1293.     e = newAV();
  1294.     hv_store(ret, "phoneLabel", 10, newRV_noinc((SV*)e), 0);
  1295.     
  1296.     for (i=0;i<5;i++) {
  1297.         av_push(e, newSViv(a.phoneLabel[i]));
  1298.     }
  1299.  
  1300.     e = newAV();
  1301.     hv_store(ret, "entry", 5, newRV_noinc((SV*)e), 0);
  1302.  
  1303.     for (i=0;i<19;i++) {
  1304.         av_push(e, a.entry[i] ? newSVpv(a.entry[i],0) : &sv_undef);
  1305.     }
  1306.     
  1307.     hv_store(ret, "showPhone", 9, newSViv(a.showPhone), 0);
  1308.     
  1309.     free_Address(&a);
  1310.     
  1311.     }
  1312.     OUTPUT:
  1313.     RETVAL
  1314.  
  1315. SV *
  1316. Pack(record)
  1317.     SV * record
  1318.     CODE:
  1319.     {
  1320.     int len;
  1321.     SV ** s;
  1322.     HV * h;
  1323.     AV * av;
  1324.     int i;
  1325.     struct Address a;
  1326.  
  1327.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  1328.         RETVAL = record;
  1329.     else {
  1330.  
  1331.     if ((s = hv_fetch(h, "phoneLabel", 10, 0)) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV))
  1332.         for (i=0;i<5;i++)
  1333.             a.phoneLabel[i] = ((s=av_fetch(av, i, 0)) && SvOK(*s)) ? SvIV(*s) : 0;
  1334.     else
  1335.         for (i=0;i<5;i++)
  1336.             a.phoneLabel[i] = 0;
  1337.  
  1338.     if ((s = hv_fetch(h, "entry", 5, 0)) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV))
  1339.         for (i=0;i<19;i++)
  1340.             a.entry[i] = ((s=av_fetch(av, i, 0)) && SvOK(*s)) ? SvPV(*s,na) : 0;
  1341.     else
  1342.         for (i=0;i<19;i++)
  1343.             a.entry[i] = 0;
  1344.     
  1345.     if ((s = hv_fetch(h, "showPhone", 9, 0)))
  1346.       a.showPhone = SvIV(*s);
  1347.     else
  1348.       a.showPhone = 0;
  1349.  
  1350.     len = pack_Address(&a, (unsigned char*)mybuf, 0xffff);
  1351.     
  1352.     RETVAL = newSVpv(mybuf, len);
  1353.  
  1354.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  1355.     }
  1356.     }
  1357.     OUTPUT:
  1358.     RETVAL
  1359.  
  1360.  
  1361. SV *
  1362. UnpackAppBlock(record)
  1363.     SV * record
  1364.     CODE:
  1365.     {
  1366.     STRLEN len;
  1367.     AV * e;
  1368.     HV * ret;
  1369.     int i;
  1370.     struct AddressAppInfo a;
  1371.  
  1372.     if (SvRV(record)) {
  1373.         SV ** raw;
  1374.         ret = (HV*)SvRV(record);
  1375.         raw = hv_fetch(ret, "raw", 3, 0);
  1376.         if (raw) {
  1377.             (void)SvPV(*raw, len);
  1378.             unpack_AddressAppInfo(&a, SvPV(*raw, na), len);
  1379.         } else {
  1380.             croak("Unable to unpack address app block");
  1381.         }
  1382.         RETVAL = SvREFCNT_inc(record);
  1383.     } else {
  1384.         ret = newHV();
  1385.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  1386.         (void)SvPV(record, len);
  1387.         unpack_AddressAppInfo(&a, SvPV(record, na), len);
  1388.         RETVAL = newRV_noinc((SV*)ret);
  1389.     }
  1390.     /*(void)SvPV(record, len);
  1391.     unpack_AddressAppInfo(&a, (unsigned char*)SvPV(record, na), len);
  1392.     ret = newHV();
  1393.     RETVAL = newRV_noinc((SV*)ret);*/
  1394.     
  1395.     doUnpackCategory(ret, &a.category);
  1396.     
  1397.     e = newAV();
  1398.     hv_store(ret, "labelRenamed", 12, newRV_noinc((SV*)e), 0);
  1399.     
  1400.     for (i=0;i<22;i++) {
  1401.         av_push(e, newSViv(a.labelRenamed[i]));
  1402.     }
  1403.  
  1404.     hv_store(ret, "country", 7, newSViv(a.country), 0);
  1405.     hv_store(ret, "sortByCompany", 13, newSViv(a.sortByCompany), 0);
  1406.  
  1407.     e = newAV();
  1408.     hv_store(ret, "label", 5, newRV_noinc((SV*)e), 0);
  1409.     
  1410.     for (i=0;i<22;i++) {
  1411.         av_push(e, newSVpv(a.labels[i],0));
  1412.     }
  1413.  
  1414.     e = newAV();
  1415.     hv_store(ret, "phoneLabel", 10, newRV_noinc((SV*)e), 0);
  1416.     
  1417.     for (i=0;i<8;i++) {
  1418.         av_push(e, newSVpv(a.phoneLabels[i],0));
  1419.     }
  1420.  
  1421.     }
  1422.     OUTPUT:
  1423.     RETVAL
  1424.  
  1425. SV *
  1426. PackAppBlock(record)
  1427.     SV * record
  1428.     CODE:
  1429.     {
  1430.     int i;
  1431.     int len;
  1432.     SV ** s;
  1433.     HV * h;
  1434.     AV * av;
  1435.     struct AddressAppInfo a;
  1436.     
  1437.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  1438.         RETVAL = record;
  1439.     else {
  1440.  
  1441.     doPackCategory(h, &a.category);
  1442.     
  1443.     if ((s = hv_fetch(h, "labelRenamed", 12, 0)) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV))
  1444.         for (i=0;i<22;i++) a.labelRenamed[i] = (s=av_fetch(av, i, 0)) ? SvIV(*s) : 0;
  1445.     else
  1446.         for (i=0;i<22;i++) a.labelRenamed[i] = 0;
  1447.         
  1448.     a.country = (s = hv_fetch(h, "country", 7, 0)) ? SvIV(*s) : 0;
  1449.     a.sortByCompany = (s = hv_fetch(h, "sortByCompany", 13, 0)) ? SvIV(*s) : 0;
  1450.  
  1451.     if ((s = hv_fetch(h, "label", 5, 0)) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV))
  1452.         for (i=0;i<22;i++) strncpy(a.labels[i], (s=av_fetch(av, i, 0)) ? SvPV(*s,na) : "", 16);
  1453.     else
  1454.         for (i=0;i<22;i++) a.labels[i][0] = 0;
  1455.     for (i=0;i<22;i++) a.labels[i][15] = 0;
  1456.  
  1457.     if ((s = hv_fetch(h, "phoneLabel", 10, 0)) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV))
  1458.         for (i=0;i<8;i++) strncpy(a.phoneLabels[i], (s=av_fetch(av, i, 0)) ? SvPV(*s,na) : "", 16);
  1459.     else
  1460.         for (i=0;i<8;i++) a.phoneLabels[i][0] = 0;
  1461.     for (i=0;i<8;i++) a.phoneLabels[i][15] = 0;
  1462.  
  1463.     len = pack_AddressAppInfo(&a, (unsigned char*)mybuf, 0xffff);
  1464.  
  1465.     RETVAL = newSVpv(mybuf, len);
  1466.  
  1467.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  1468.     }
  1469.     }
  1470.     OUTPUT:
  1471.     RETVAL
  1472.  
  1473. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot::Memo
  1474.  
  1475. SV *
  1476. Unpack(record)
  1477.     SV * record
  1478.     CODE:
  1479.     {
  1480.     STRLEN len;
  1481.     int i;
  1482.     AV * e;
  1483.     HV * ret;
  1484.     struct Memo a;
  1485.  
  1486.     if (SvRV(record)) {
  1487.         SV ** raw;
  1488.         ret = (HV*)SvRV(record);
  1489.         raw = hv_fetch(ret, "raw", 3, 0);
  1490.         if (raw) {
  1491.             (void)SvPV(*raw, len);
  1492.             unpack_Memo(&a, SvPV(*raw, na), len);
  1493.         } else {
  1494.             croak("Unable to unpack memo");
  1495.         }
  1496.         RETVAL = SvREFCNT_inc(record);
  1497.     } else {
  1498.         ret = newHV();
  1499.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  1500.         (void)SvPV(record, len);
  1501.         unpack_Memo(&a, SvPV(record, na), len);
  1502.         RETVAL = newRV_noinc((SV*)ret);
  1503.     }
  1504.     /*(void)SvPV(record, len);
  1505.     unpack_Memo(&a, (unsigned char*)SvPV(record, na), len);
  1506.     ret = newHV();
  1507.     RETVAL = newRV_noinc((SV*)ret);*/
  1508.  
  1509.     hv_store(ret, "text", 4, newSVpv(a.text,0), 0);
  1510.  
  1511.     free_Memo(&a);
  1512.     }
  1513.     OUTPUT:
  1514.     RETVAL
  1515.  
  1516. SV *
  1517. Pack(record)
  1518.     SV * record
  1519.     CODE:
  1520.     {
  1521.     STRLEN len;
  1522.     SV ** s;
  1523.     HV * h;
  1524.     struct Memo a;
  1525.     
  1526.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  1527.         RETVAL = record;
  1528.     else {
  1529.     
  1530.     if ((s = hv_fetch(h, "text", 4, 0)))
  1531.         a.text = SvPV(*s,na);
  1532.     else
  1533.         a.text = 0;
  1534.     
  1535.     len = pack_Memo(&a, (unsigned char*)mybuf, 0xffff);
  1536.     
  1537.     RETVAL = newSVpv(mybuf, len);
  1538.     
  1539.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  1540.     }
  1541.     }
  1542.     OUTPUT:
  1543.     RETVAL
  1544.  
  1545. SV *
  1546. UnpackAppBlock(record)
  1547.     SV * record
  1548.     CODE:
  1549.     {
  1550.     STRLEN len;
  1551.     AV * e;
  1552.     HV * ret;
  1553.     int i;
  1554.     struct MemoAppInfo a;
  1555.  
  1556.     if (SvRV(record)) {
  1557.         SV ** raw;
  1558.         ret = (HV*)SvRV(record);
  1559.         raw = hv_fetch(ret, "raw", 3, 0);
  1560.         if (raw) {
  1561.             (void)SvPV(*raw, len);
  1562.             unpack_MemoAppInfo(&a, SvPV(*raw, na), len);
  1563.         } else {
  1564.             croak("Unable to unpack memo app block");
  1565.         }
  1566.         RETVAL = SvREFCNT_inc(record);
  1567.     } else {
  1568.         ret = newHV();
  1569.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  1570.         (void)SvPV(record, len);
  1571.         unpack_MemoAppInfo(&a, SvPV(record, na), len);
  1572.         RETVAL = newRV_noinc((SV*)ret);
  1573.     }
  1574.     /*(void)SvPV(record, len);
  1575.     unpack_MemoAppInfo(&a, (unsigned char*)SvPV(record, na), len);
  1576.     ret = newHV();
  1577.     RETVAL = newRV_noinc((SV*)ret);*/
  1578.  
  1579.     doUnpackCategory(ret, &a.category);
  1580.  
  1581.     hv_store(ret, "sortByAlpha", 11, newSViv(a.sortByAlpha), 0);
  1582.  
  1583.     }
  1584.     OUTPUT:
  1585.     RETVAL
  1586.  
  1587. SV *
  1588. PackAppBlock(record)
  1589.     SV * record
  1590.     CODE:
  1591.     {
  1592.     int i;
  1593.     int len;
  1594.     SV ** s;
  1595.     HV * h;
  1596.     AV * av;
  1597.     struct MemoAppInfo a;
  1598.     
  1599.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  1600.         RETVAL = record;
  1601.     else {
  1602.  
  1603.     doPackCategory(h, &a.category);
  1604.     
  1605.         
  1606.     if ((s = hv_fetch(h, "sortByAlpha", 11, 0)))
  1607.         a.sortByAlpha = SvIV(*s);
  1608.     else
  1609.         a.sortByAlpha = 0;
  1610.     
  1611.     len = pack_MemoAppInfo(&a, (unsigned char*)mybuf, 0xffff);
  1612.  
  1613.     RETVAL = newSVpv(mybuf, len);
  1614.  
  1615.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  1616.     }
  1617.     }
  1618.     OUTPUT:
  1619.     RETVAL
  1620.  
  1621. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot::Expense
  1622.  
  1623. SV *
  1624. Unpack(record)
  1625.     SV * record
  1626.     CODE:
  1627.     {
  1628.     STRLEN len;
  1629.     int i;
  1630.     HV * ret;
  1631.     struct Expense e;
  1632.  
  1633.     if (SvRV(record)) {
  1634.         SV ** raw;
  1635.         ret = (HV*)SvRV(record);
  1636.         raw = hv_fetch(ret, "raw", 3, 0);
  1637.         if (raw) {
  1638.             (void)SvPV(*raw, len);
  1639.             unpack_Expense(&e, SvPV(*raw, na), len);
  1640.         } else {
  1641.             croak("Unable to unpack memo");
  1642.         }
  1643.         RETVAL = SvREFCNT_inc(record);
  1644.     } else {
  1645.         ret = newHV();
  1646.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  1647.         (void)SvPV(record, len);
  1648.         unpack_Expense(&e, SvPV(record, na), len);
  1649.         RETVAL = newRV_noinc((SV*)ret);
  1650.     }
  1651.  
  1652.     hv_store(ret, "date", 4, newRV_noinc((SV*)tmtoav(&e.date)), 0);
  1653.     hv_store(ret, "type", 4, newSVlist(e.type,ExpenseTypeNames),0);
  1654.     hv_store(ret, "payment", 7, newSVlist(e.payment,ExpensePaymentNames),0);
  1655.     hv_store(ret, "currency", 8, newSViv(e.currency),0);
  1656.     if (e.amount)
  1657.         hv_store(ret, "amount", 6, newSVpv(e.amount,0), 0);
  1658.     if (e.vendor)
  1659.         hv_store(ret, "vendor", 6, newSVpv(e.vendor,0), 0);
  1660.     if (e.city)
  1661.         hv_store(ret, "city", 4, newSVpv(e.city,0), 0);
  1662.     if (e.note)
  1663.         hv_store(ret, "note", 4, newSVpv(e.note,0), 0);
  1664.     if (e.attendees)
  1665.         hv_store(ret, "attendees", 9, newSVpv(e.attendees,0), 0);
  1666.  
  1667.     free_Expense(&e);
  1668.     }
  1669.     OUTPUT:
  1670.     RETVAL
  1671.  
  1672. SV *
  1673. Pack(record)
  1674.     SV * record
  1675.     CODE:
  1676.     {
  1677.     STRLEN len;
  1678.     SV ** s;
  1679.     HV * h;
  1680.     struct Expense e;
  1681.     
  1682.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  1683.         RETVAL = record;
  1684.     else {
  1685.  
  1686.     if ((s = hv_fetch(h, "type", 4, 0)))
  1687.         e.type = SvList(*s,ExpenseTypeNames);
  1688.     else
  1689.         croak("must have type");
  1690.     if ((s = hv_fetch(h, "payment", 7, 0)))
  1691.         e.payment = SvList(*s,ExpensePaymentNames);
  1692.     else
  1693.         croak("must have payment");
  1694.     if ((s = hv_fetch(h, "currency", 8, 0)))
  1695.         e.currency = SvIV(*s);
  1696.     else
  1697.         croak("must have currency");
  1698.     
  1699.     if (s = hv_fetch(h, "date", 4, 0)) avtotm((AV*)SvRV(*s), &e.date);
  1700.  
  1701.     if ((s = hv_fetch(h, "amount", 6, 0))) e.amount = SvPV(*s,na);
  1702.     else e.amount = 0;
  1703.     if ((s = hv_fetch(h, "vendor", 6, 0))) e.vendor = SvPV(*s,na);
  1704.     else e.vendor = 0;
  1705.     if ((s = hv_fetch(h, "city", 4, 0))) e.city = SvPV(*s,na);
  1706.     else e.city = 0;
  1707.     if ((s = hv_fetch(h, "attendess", 9, 0))) e.attendees = SvPV(*s,na);
  1708.     else e.attendees = 0;
  1709.     if ((s = hv_fetch(h, "note", 4, 0))) e.note = SvPV(*s,na);
  1710.     else e.note = 0;
  1711.     
  1712.     len = pack_Expense(&e, (unsigned char*)mybuf, 0xffff);
  1713.     
  1714.     RETVAL = newSVpv(mybuf, len);
  1715.     
  1716.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  1717.  
  1718.  
  1719.     }
  1720.     }
  1721.     OUTPUT:
  1722.     RETVAL
  1723.  
  1724. SV *
  1725. UnpackAppBlock(record)
  1726.     SV * record
  1727.     CODE:
  1728.     {
  1729.     STRLEN len;
  1730.     HV * ret;
  1731.     AV * a;
  1732.     int i;
  1733.     struct ExpenseAppInfo e;
  1734.  
  1735.     if (SvRV(record)) {
  1736.         SV ** raw;
  1737.         ret = (HV*)SvRV(record);
  1738.         raw = hv_fetch(ret, "raw", 3, 0);
  1739.         if (raw) {
  1740.             (void)SvPV(*raw, len);
  1741.             unpack_ExpenseAppInfo(&e, SvPV(*raw, na), len);
  1742.         } else {
  1743.             croak("Unable to unpack memo app block");
  1744.         }
  1745.         RETVAL = SvREFCNT_inc(record);
  1746.     } else {
  1747.         ret = newHV();
  1748.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  1749.         (void)SvPV(record, len);
  1750.         unpack_ExpenseAppInfo(&e, SvPV(record, na), len);
  1751.         RETVAL = newRV_noinc((SV*)ret);
  1752.     }
  1753.  
  1754.     hv_store(ret, "sortOrder", 9, newSVlist(e.sortOrder,ExpenseSortNames),0);
  1755.     a = newAV();
  1756.     hv_store(ret, "currencies", 10, newRV_noinc((SV*)a), 0);
  1757.     for (i=0;i<4;i++) {
  1758.         HV * h = newHV();
  1759.         hv_store(h, "name", 4, newSVpv(e.currencies[i].name, 0), 0);
  1760.         hv_store(h, "symbol", 6, newSVpv(e.currencies[i].symbol, 0), 0);
  1761.         hv_store(h, "rate", 4, newSVpv(e.currencies[i].rate, 0), 0);
  1762.         av_store(a, i, (SV*)newRV_noinc((SV*)h));
  1763.     }
  1764.  
  1765.     doUnpackCategory(ret, &e.category);
  1766.  
  1767.     }
  1768.     OUTPUT:
  1769.     RETVAL
  1770.  
  1771. SV *
  1772. PackAppBlock(record)
  1773.     SV * record
  1774.     CODE:
  1775.     {
  1776.     int i;
  1777.     int len;
  1778.     SV ** s;
  1779.     HV * h;
  1780.     AV * av;
  1781.     struct ExpenseAppInfo e;
  1782.     
  1783.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  1784.         RETVAL = record;
  1785.     else {
  1786.  
  1787.     doPackCategory(h, &e.category);
  1788.  
  1789.     e.sortOrder = (s = hv_fetch(h, "sortOrder", 9, 0)) ? SvList(*s, ExpenseSortNames) : 0;
  1790.     if ((s=hv_fetch(h, "currencies", 10, 0)) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV)) {
  1791.         for(i=0;i<4;i++) {
  1792.             HV * hv;
  1793.             if ((s=av_fetch(av, i, 0)) && SvRV(*s) && (SvTYPE(hv=(HV*)SvRV(*s))==SVt_PVHV)) {
  1794.                 if (s = hv_fetch(hv, "name", 4, 0)) {
  1795.                     strncpy(e.currencies[i].name, SvPV(*s, na), 16);
  1796.                     e.currencies[i].name[15] = 0;
  1797.                 }
  1798.                 if (s = hv_fetch(hv, "symbol", 6, 0)) {
  1799.                     strncpy(e.currencies[i].symbol, SvPV(*s, na), 4);
  1800.                     e.currencies[i].symbol[3] = 0;
  1801.                 }
  1802.                 if (s = hv_fetch(hv, "rate", 4, 0)) {
  1803.                     strncpy(e.currencies[i].rate, SvPV(*s, na), 8);
  1804.                     e.currencies[i].rate[7] = 0;
  1805.                 }
  1806.             }
  1807.         }
  1808.     } else
  1809.         for(i=0;i<4;i++) {
  1810.             e.currencies[i].symbol[0] = 0;
  1811.             e.currencies[i].name[0] = 0;
  1812.             e.currencies[i].rate[0] = 0;
  1813.         }
  1814.     
  1815.     len = pack_ExpenseAppInfo(&e, (unsigned char*)mybuf, 0xffff);
  1816.  
  1817.     RETVAL = newSVpv(mybuf, len);
  1818.  
  1819.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  1820.     }
  1821.     }
  1822.     OUTPUT:
  1823.     RETVAL
  1824.  
  1825. SV *
  1826. UnpackPref(record)
  1827.     SV * record
  1828.     CODE:
  1829.     {
  1830.     STRLEN len;
  1831.     AV * e;
  1832.     HV * ret;
  1833.     int i;
  1834.     struct ExpensePref a;
  1835.  
  1836.     if (SvRV(record)) {
  1837.         SV ** raw;
  1838.         ret = (HV*)SvRV(record);
  1839.         raw = hv_fetch(ret, "raw", 3, 0);
  1840.         if (raw) {
  1841.             (void)SvPV(*raw, len);
  1842.             unpack_ExpensePref(&a, SvPV(*raw, na), len);
  1843.         } else {
  1844.             croak("Unable to unpack mail pref");
  1845.         }
  1846.         RETVAL = SvREFCNT_inc(record);
  1847.     } else {
  1848.         ret = newHV();
  1849.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  1850.         (void)SvPV(record, len);
  1851.         unpack_ExpensePref(&a, SvPV(record, na), len);
  1852.         RETVAL = newRV_noinc((SV*)ret);
  1853.     }
  1854.  
  1855.     hv_store(ret, "unitOfDistance", 14, newSVlist(a.unitOfDistance, ExpenseDistanceNames), 0);
  1856.     hv_store(ret, "currentCategory", 15, newSViv(a.currentCategory), 0);
  1857.     hv_store(ret, "defaultCategory", 15, newSViv(a.defaultCategory), 0);
  1858.     hv_store(ret, "noteFont", 8, newSViv(a.noteFont), 0);
  1859.     hv_store(ret, "showAllCategories", 17, newSViv(a.showAllCategories), 0);
  1860.     hv_store(ret, "showCurrency", 12, newSViv(a.showCurrency), 0);
  1861.     hv_store(ret, "saveBackup", 10, newSViv(a.saveBackup), 0);
  1862.     hv_store(ret, "allowQuickFill", 14, newSViv(a.allowQuickFill), 0);
  1863.     e = newAV();
  1864.     for (i=0;i<7;i++)
  1865.         av_store(e, i, newSViv(a.currencies[i]));
  1866.     hv_store(ret, "currencies", 10, (SV*)newRV_noinc((SV*)e), 0);
  1867.  
  1868.     }
  1869.     OUTPUT:
  1870.     RETVAL
  1871.  
  1872. SV *
  1873. PackPref(record, id)
  1874.     SV * record
  1875.     int    id
  1876.     CODE:
  1877.     {
  1878.     int i;
  1879.     int len;
  1880.     SV ** s;
  1881.     HV * h;
  1882.     AV * av;
  1883.     struct ExpensePref a;
  1884.     
  1885.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  1886.         RETVAL = record;
  1887.     else {
  1888.  
  1889.     a.unitOfDistance = (s = hv_fetch(h, "unitOfDistance", 14, 0)) ? SvList(*s, ExpenseDistanceNames) : 0;
  1890.     a.currentCategory = (s=hv_fetch(h,"currentCategory",15,0)) ? SvIV(*s) : 0;
  1891.     a.defaultCategory = (s=hv_fetch(h,"defaultCategory",15,0)) ? SvIV(*s) : 0;
  1892.     a.noteFont = (s=hv_fetch(h,"noteFont",8,0)) ? SvIV(*s) : 0;
  1893.     a.showAllCategories = (s=hv_fetch(h,"showAllCategories",17,0)) ? SvIV(*s) : 0;
  1894.     a.showCurrency = (s=hv_fetch(h,"showCurrency",12,0)) ? SvIV(*s) : 0;
  1895.     a.saveBackup = (s=hv_fetch(h,"saveBackup",10,0)) ? SvIV(*s) : 0;
  1896.     a.allowQuickFill = (s=hv_fetch(h,"allowQuickFill",14,0)) ? SvIV(*s) : 0;
  1897.     
  1898.     if ((s=hv_fetch(h, "currencies", 10, 0)) && SvRV(*s) && (SvTYPE(av=(AV*)SvRV(*s))==SVt_PVAV)) {
  1899.         for(i=0;i<7;i++)
  1900.             a.currencies[i] = (s=av_fetch(av, i, 0)) ? SvIV(*s) : 0;
  1901.     } else
  1902.         for(i=0;i<7;i++)
  1903.             a.currencies[i] = 0;
  1904.         
  1905.     len = pack_ExpensePref(&a, (unsigned char*)mybuf, 0xffff);
  1906.     RETVAL = newSVpv(mybuf, len);
  1907.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  1908.     }
  1909.     }
  1910.     OUTPUT:
  1911.     RETVAL
  1912.  
  1913. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot::Mail
  1914.  
  1915. SV *
  1916. Unpack(record)
  1917.     SV * record
  1918.     CODE:
  1919.     {
  1920.     STRLEN len;
  1921.     int i;
  1922.     AV * e;
  1923.     HV * ret;
  1924.     struct Mail a;
  1925.  
  1926.     if (SvRV(record)) {
  1927.         SV ** raw;
  1928.         ret = (HV*)SvRV(record);
  1929.         raw = hv_fetch(ret, "raw", 3, 0);
  1930.         if (raw) {
  1931.             (void)SvPV(*raw, len);
  1932.             unpack_Mail(&a, SvPV(*raw, na), len);
  1933.         } else {
  1934.             croak("Unable to unpack mail");
  1935.         }
  1936.         RETVAL = SvREFCNT_inc(record);
  1937.     } else {
  1938.         ret = newHV();
  1939.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  1940.         (void)SvPV(record, len);
  1941.         unpack_Mail(&a, SvPV(record, na), len);
  1942.         RETVAL = newRV_noinc((SV*)ret);
  1943.     }
  1944.     /*(void)SvPV(record, len);
  1945.     unpack_Mail(&a, (unsigned char*)SvPV(record, na), len);
  1946.     ret = newHV();
  1947.     RETVAL = newRV_noinc((SV*)ret);*/
  1948.     
  1949.     if (a.subject) hv_store(ret, "subject", 7, newSVpv(a.subject,0), 0);
  1950.     if (a.from) hv_store(ret, "from", 4, newSVpv(a.from,0), 0);
  1951.     if (a.to) hv_store(ret, "to", 2, newSVpv(a.to,0), 0);
  1952.     if (a.cc) hv_store(ret, "cc", 2, newSVpv(a.cc,0), 0);
  1953.     if (a.bcc) hv_store(ret, "bcc", 3, newSVpv(a.bcc,0), 0);
  1954.     if (a.replyTo) hv_store(ret, "replyTo", 7, newSVpv(a.replyTo,0), 0);
  1955.     if (a.sentTo) hv_store(ret, "sentTo", 6, newSVpv(a.sentTo,0), 0);
  1956.     if (a.body) hv_store(ret, "body", 4, newSVpv(a.body,0), 0);
  1957.     
  1958.     hv_store(ret, "read", 4, newSViv(a.read), 0);
  1959.     hv_store(ret, "signature", 9, newSViv(a.signature), 0);
  1960.     hv_store(ret, "confirmRead", 11, newSViv(a.confirmRead), 0);
  1961.     hv_store(ret, "confirmDelivery", 15, newSViv(a.confirmDelivery), 0);
  1962.     hv_store(ret, "priority", 8, newSViv(a.priority), 0);
  1963.     hv_store(ret, "addressing", 10, newSViv(a.addressing), 0);
  1964.  
  1965.     if (a.dated)
  1966.         hv_store(ret, "date", 4, newRV_noinc((SV*)tmtoav(&a.date)), 0);
  1967.  
  1968.     free_Mail(&a);
  1969.     }
  1970.     OUTPUT:
  1971.     RETVAL
  1972.  
  1973. SV *
  1974. Pack(record)
  1975.     SV * record
  1976.     CODE:
  1977.     {
  1978.     STRLEN len;
  1979.     SV ** s;
  1980.     HV * h;
  1981.     struct Mail a;
  1982.     
  1983.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  1984.         RETVAL = record;
  1985.     else {
  1986.     
  1987.     a.subject = (s = hv_fetch(h, "subject", 7, 0)) ? SvPV(*s,na) : 0;
  1988.     a.from = (s = hv_fetch(h, "from", 4, 0)) ? SvPV(*s,na) : 0;
  1989.     a.to = (s = hv_fetch(h, "to", 2, 0)) ? SvPV(*s,na) : 0;
  1990.     a.cc = (s = hv_fetch(h, "cc", 2, 0)) ? SvPV(*s,na) : 0;
  1991.     a.bcc = (s = hv_fetch(h, "bcc", 3, 0)) ? SvPV(*s,na) : 0;
  1992.     a.replyTo = (s = hv_fetch(h, "replyTo", 7, 0)) ? SvPV(*s,na) : 0;
  1993.     a.sentTo = (s = hv_fetch(h, "sentTo", 6, 0)) ? SvPV(*s,na) : 0;
  1994.     a.body = (s = hv_fetch(h, "body", 4, 0)) ? SvPV(*s,na) : 0;
  1995.     
  1996.     a.read = (s = hv_fetch(h, "body", 4, 0)) ? SvIV(*s) : 0;
  1997.     a.signature = (s = hv_fetch(h, "signature", 9, 0)) ? SvIV(*s) : 0;
  1998.     a.confirmRead = (s = hv_fetch(h, "confirmRead", 11, 0)) ? SvIV(*s) : 0;
  1999.     a.confirmDelivery = (s = hv_fetch(h, "confirmDelivery", 15, 0)) ? SvIV(*s) : 0;
  2000.     a.priority = (s = hv_fetch(h, "priority", 8, 0)) ? SvIV(*s) : 0;
  2001.     a.addressing = (s = hv_fetch(h, "addressing", 10, 0)) ? SvIV(*s) : 0;
  2002.     
  2003.     a.dated = (s = hv_fetch(h, "date", 4, 0)) ? 1 : 0;
  2004.     if (s) avtotm((AV*)SvRV(*s), &a.date);
  2005.  
  2006.     len = pack_Mail(&a, (unsigned char*)mybuf, 0xffff);
  2007.     
  2008.     RETVAL = newSVpv(mybuf, len);
  2009.  
  2010.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  2011.     }
  2012.     }
  2013.     OUTPUT:
  2014.     RETVAL
  2015.  
  2016. SV *
  2017. UnpackAppBlock(record)
  2018.     SV * record
  2019.     CODE:
  2020.     {
  2021.     STRLEN len;
  2022.     AV * e;
  2023.     HV * ret;
  2024.     int i;
  2025.     struct MailAppInfo a;
  2026.  
  2027.     if (SvRV(record)) {
  2028.         SV ** raw;
  2029.         ret = (HV*)SvRV(record);
  2030.         raw = hv_fetch(ret, "raw", 3, 0);
  2031.         if (raw) {
  2032.             (void)SvPV(*raw, len);
  2033.             unpack_MailAppInfo(&a, SvPV(*raw, na), len);
  2034.         } else {
  2035.             croak("Unable to unpack mail app block");
  2036.         }
  2037.         RETVAL = SvREFCNT_inc(record);
  2038.     } else {
  2039.         ret = newHV();
  2040.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  2041.         (void)SvPV(record, len);
  2042.         unpack_MailAppInfo(&a, SvPV(record, na), len);
  2043.         RETVAL = newRV_noinc((SV*)ret);
  2044.     }
  2045.  
  2046.     doUnpackCategory(ret, &a.category);
  2047.  
  2048.     hv_store(ret, "sortOrder", 9, newSVlist(a.sortOrder, MailSortTypeNames), 0);
  2049.  
  2050.     hv_store(ret, "dirty", 5, newSViv(a.dirty), 0);
  2051.     hv_store(ret, "unsentMessage", 13, newSViv(a.unsentMessage), 0);
  2052.  
  2053.     }
  2054.     OUTPUT:
  2055.     RETVAL
  2056.  
  2057. SV *
  2058. PackAppBlock(record)
  2059.     SV * record
  2060.     CODE:
  2061.     {
  2062.     int i;
  2063.     int len;
  2064.     SV ** s;
  2065.     HV * h;
  2066.     AV * av;
  2067.     struct MailAppInfo a;
  2068.     
  2069.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  2070.         RETVAL = record;
  2071.     else {
  2072.  
  2073.  
  2074.     doPackCategory(h, &a.category);
  2075.     
  2076.     if ((s = hv_fetch(h, "sortOrder", 9, 0)))
  2077.         a.sortOrder = SvList(*s, MailSortTypeNames);
  2078.     else
  2079.         a.sortOrder = 0;
  2080.  
  2081.     a.dirty = (s=hv_fetch(h,"dirty",5,0)) ? SvIV(*s) : 0;
  2082.     a.unsentMessage = (s=hv_fetch(h,"unsentMessage",13,0)) ? SvIV(*s) : 0;
  2083.  
  2084.     len = pack_MailAppInfo(&a, (unsigned char*)mybuf, 0xffff);
  2085.  
  2086.     RETVAL = newSVpv(mybuf, len);
  2087.  
  2088.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  2089.     }
  2090.     }
  2091.     OUTPUT:
  2092.     RETVAL
  2093.  
  2094. SV *
  2095. UnpackSyncPref(record)
  2096.     SV * record
  2097.     CODE:
  2098.     {
  2099.     STRLEN len;
  2100.     AV * e;
  2101.     HV * ret;
  2102.     int i;
  2103.     struct MailSyncPref a;
  2104.  
  2105.     if (SvRV(record)) {
  2106.         SV ** raw;
  2107.         ret = (HV*)SvRV(record);
  2108.         raw = hv_fetch(ret, "raw", 3, 0);
  2109.         if (raw) {
  2110.             (void)SvPV(*raw, len);
  2111.             unpack_MailSyncPref(&a, SvPV(*raw, na), len);
  2112.         } else {
  2113.             croak("Unable to unpack mail pref");
  2114.         }
  2115.         RETVAL = SvREFCNT_inc(record);
  2116.     } else {
  2117.         ret = newHV();
  2118.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  2119.         (void)SvPV(record, len);
  2120.         unpack_MailSyncPref(&a, SvPV(record, na), len);
  2121.         RETVAL = newRV_noinc((SV*)ret);
  2122.     }
  2123.  
  2124.     hv_store(ret, "syncType", 8, newSVlist(a.syncType, MailSyncTypeNames), 0);
  2125.     hv_store(ret, "getHigh", 7, newSViv(a.getHigh), 0);
  2126.     hv_store(ret, "getContaining", 13, newSViv(a.getContaining), 0);
  2127.     hv_store(ret, "truncate", 8, newSViv(a.truncate), 0);
  2128.   
  2129.     if (a.filterTo)  
  2130.         hv_store(ret, "filterTo", 8, newSVpv(a.filterTo, 0), 0);
  2131.     if (a.filterFrom)  
  2132.         hv_store(ret, "filterFrom", 10, newSVpv(a.filterFrom, 0), 0);
  2133.     if (a.filterSubject)  
  2134.         hv_store(ret, "filterSubject", 13, newSVpv(a.filterSubject, 0), 0);
  2135.  
  2136.     }
  2137.     OUTPUT:
  2138.     RETVAL
  2139.  
  2140. SV *
  2141. PackSyncPref(record, id)
  2142.     SV * record
  2143.     int    id
  2144.     CODE:
  2145.     {
  2146.     int i;
  2147.     int len;
  2148.     SV ** s;
  2149.     HV * h;
  2150.     AV * av;
  2151.     struct MailSyncPref a;
  2152.     
  2153.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  2154.         RETVAL = record;
  2155.     else {
  2156.  
  2157.     if ((s = hv_fetch(h, "syncType", 8, 0)))
  2158.         a.syncType = SvList(*s, MailSyncTypeNames);
  2159.     else
  2160.         a.syncType = 0;
  2161.  
  2162.     a.getHigh = (s=hv_fetch(h,"getHigh",7,0)) ? SvIV(*s) : 0;
  2163.     a.getContaining = (s=hv_fetch(h,"getContaining",13,0)) ? SvIV(*s) : 0;
  2164.     a.truncate = (s=hv_fetch(h,"truncate",8,0)) ? SvIV(*s) : 0;
  2165.  
  2166.     a.filterTo = (s=hv_fetch(h,"filterTo",8,0)) ? SvPV(*s,na) : 0;
  2167.     a.filterFrom = (s=hv_fetch(h,"filterFrom",10,0)) ? SvPV(*s,na) : 0;
  2168.     a.filterSubject = (s=hv_fetch(h,"filterSubject",13,0)) ? SvPV(*s,na) : 0;
  2169.  
  2170.     len = pack_MailSyncPref(&a, (unsigned char*)mybuf, 0xffff);
  2171.     RETVAL = newSVpv(mybuf, len);
  2172.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  2173.     }
  2174.     }
  2175.     OUTPUT:
  2176.     RETVAL
  2177.  
  2178. SV *
  2179. UnpackSignaturePref(record)
  2180.     SV * record
  2181.     CODE:
  2182.     {
  2183.     STRLEN len;
  2184.     AV * e;
  2185.     HV * ret;
  2186.     int i;
  2187.     struct MailSignaturePref a;
  2188.  
  2189.     if (SvRV(record)) {
  2190.         SV ** raw;
  2191.         ret = (HV*)SvRV(record);
  2192.         raw = hv_fetch(ret, "raw", 3, 0);
  2193.         if (raw) {
  2194.             (void)SvPV(*raw, len);
  2195.             unpack_MailSignaturePref(&a, SvPV(*raw, na), len);
  2196.         } else {
  2197.             croak("Unable to unpack mail pref");
  2198.         }
  2199.         RETVAL = SvREFCNT_inc(record);
  2200.     } else {
  2201.         ret = newHV();
  2202.         hv_store(ret, "raw", 3, SvREFCNT_inc(record), 0);
  2203.         (void)SvPV(record, len);
  2204.         unpack_MailSignaturePref(&a, SvPV(record, na), len);
  2205.         RETVAL = newRV_noinc((SV*)ret);
  2206.     }
  2207.  
  2208.   
  2209.     if (a.signature)  
  2210.         hv_store(ret, "signature", 9, newSVpv(a.signature, 0), 0);
  2211.  
  2212.     }
  2213.     OUTPUT:
  2214.     RETVAL
  2215.  
  2216. SV *
  2217. PackSignaturePref(record, id)
  2218.     SV * record
  2219.     int    id
  2220.     CODE:
  2221.     {
  2222.     int i;
  2223.     int len;
  2224.     SV ** s;
  2225.     HV * h;
  2226.     AV * av;
  2227.     struct MailSignaturePref a;
  2228.     
  2229.     if (!SvRV(record) || (SvTYPE(h=(HV*)SvRV(record))!=SVt_PVHV))
  2230.         RETVAL = record;
  2231.     else {
  2232.  
  2233.     a.signature = (s=hv_fetch(h,"signature",9,0)) ? SvPV(*s,na) : 0;
  2234.  
  2235.     len = pack_MailSignaturePref(&a, (unsigned char*)mybuf, 0xffff);
  2236.     RETVAL = newSVpv(mybuf, len);
  2237.     hv_store(h, "raw", 3, SvREFCNT_inc(RETVAL), 0);
  2238.     }
  2239.     }
  2240.     OUTPUT:
  2241.     RETVAL
  2242.  
  2243. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot
  2244.  
  2245. int
  2246. close(socket)
  2247.     int    socket
  2248.     CODE:
  2249.     RETVAL = pi_close(socket);
  2250.     OUTPUT:
  2251.     RETVAL
  2252.  
  2253. int
  2254. write(socket, msg)
  2255.     int    socket
  2256.     SV *    msg
  2257.     CODE: {
  2258.         STRLEN len;
  2259.         RETVAL = pi_write(socket,SvPV(msg,len),len);
  2260.     }
  2261.  
  2262. SV *
  2263. read(socket, len)
  2264.     int    socket
  2265.     int    len
  2266.     CODE:
  2267.     {
  2268.         int result;
  2269.         if (len > sizeof(mybuf))
  2270.             len = sizeof(mybuf);
  2271.         result = pi_read(socket, mybuf, len);
  2272.         if (RETVAL >=0) 
  2273.             RETVAL = newSVpv(mybuf, result);
  2274.         else
  2275.             RETVAL = &sv_undef;
  2276.     }
  2277.     OUTPUT:
  2278.     RETVAL
  2279.  
  2280. int
  2281. socket(domain, type, protocol)
  2282.     int    domain
  2283.     int    type
  2284.     int    protocol
  2285.     CODE:
  2286.     RETVAL = pi_socket(domain, type, protocol);
  2287.     OUTPUT:
  2288.     RETVAL
  2289.  
  2290. int
  2291. listen(socket, backlog)
  2292.     int    socket
  2293.     int    backlog
  2294.     CODE:
  2295.     RETVAL = pi_listen(socket, backlog);
  2296.     OUTPUT:
  2297.     RETVAL
  2298.  
  2299. char *
  2300. errorText(error)
  2301.     int error
  2302.     CODE:
  2303.     RETVAL = dlp_strerror(error);
  2304.     OUTPUT:
  2305.     RETVAL
  2306.  
  2307. int
  2308. bind(socket, sockaddr)
  2309.     int    socket
  2310.     SV *    sockaddr
  2311.     CODE:
  2312.     {
  2313.         struct pi_sockaddr a;
  2314.         HV * h;
  2315.         if ((h=(HV*)SvRV(sockaddr)) && (SvTYPE(SvRV(sockaddr))==SVt_PVHV)) {
  2316.             SV ** s;
  2317.             char * name;
  2318.             struct pi_sockaddr * a;
  2319.             if ((s = hv_fetch(h, "device", 6, 0)))
  2320.                 name = SvPV(*s,na);
  2321.             else
  2322.                 name = "";
  2323.             a = calloc(1,sizeof(struct pi_sockaddr)+strlen(name));
  2324.             strcpy(a->pi_device, name);
  2325.             a->pi_family = (s = hv_fetch(h, "family", 6, 0)) ? SvIV(*s) : 0;
  2326.             RETVAL = pi_bind(socket, (struct sockaddr*)a, sizeof(struct pi_sockaddr)+strlen(name));
  2327.         } else {
  2328.             STRLEN len;
  2329.             void * c = SvPV(sockaddr, len);
  2330.             RETVAL = pi_bind(socket, (struct sockaddr*)c, len);
  2331.         }
  2332.     }
  2333.     OUTPUT:
  2334.     RETVAL
  2335.  
  2336. int
  2337. openPort(port)
  2338.     char *    port
  2339.     CODE:
  2340.     {
  2341.         struct pi_sockaddr a;
  2342.         int socket = pi_socket(PI_AF_SLP, PI_SOCK_STREAM, PI_PF_PADP);
  2343.         
  2344.         strcpy(a.pi_device, port);
  2345.         a.pi_family = PI_AF_SLP;
  2346.         pi_bind(socket, (struct sockaddr*)&a, sizeof(a));
  2347.         
  2348.         pi_listen(socket, 1);
  2349.         
  2350.         RETVAL = socket;
  2351.     }
  2352.     OUTPUT:
  2353.     RETVAL
  2354.  
  2355. SV *
  2356. accept(socket)
  2357.     int    socket
  2358.     CODE:
  2359.     {
  2360.         struct pi_sockaddr a;
  2361.         int len = sizeof(struct pi_sockaddr);
  2362.         int result;
  2363.         result = pi_accept(socket, (struct sockaddr*)&a, &len);
  2364.         if (result < 0) {
  2365.             RETVAL = newSViv(result);
  2366.         } else {
  2367.             PDA__Pilot__DLP * x = malloc(sizeof(PDA__Pilot__DLP));
  2368.             SV * sv = newSViv((IV)(void*)x);
  2369.             x->errno = 0;
  2370.             x->socket = result;
  2371.             RETVAL = newRV(sv);
  2372.             SvREFCNT_dec(sv);
  2373.             sv_bless(RETVAL, gv_stashpv("PDA::Pilot::DLPPtr",0));
  2374.         }
  2375.     }
  2376.     OUTPUT:
  2377.     RETVAL
  2378.  
  2379. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot::DLP::DBPtr
  2380.  
  2381. void
  2382. DESTROY(db)
  2383.     PDA::Pilot::DLP::DB *    db
  2384.     CODE:
  2385.     if (db->Class)
  2386.         SvREFCNT_dec(db->Class);
  2387.     if (db->handle)
  2388.         dlp_CloseDB(db->socket, db->handle);
  2389.     if (db->dbname)
  2390.         SvREFCNT_dec(db->dbname);
  2391.     SvREFCNT_dec(db->connection);
  2392.     free(db);
  2393.  
  2394. int
  2395. errno(self)
  2396.     PDA::Pilot::DLP::DB *    self
  2397.     CODE:
  2398.         RETVAL = self->errno;
  2399.         self->errno = 0;
  2400.     OUTPUT:
  2401.     RETVAL
  2402.  
  2403. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot::DLP::DBPtr
  2404.  
  2405. SV *
  2406. class(self, name=0)
  2407.     PDA::Pilot::DLP::DB *    self
  2408.     SV *    name
  2409.     CODE:
  2410.     {
  2411.         SV ** s = 0;
  2412.         HV * h;
  2413.         if (name) {
  2414.             int len;
  2415.             h = perl_get_hv("PDA::Pilot::DBClasses", 0);
  2416.             if (!h)
  2417.                 croak("DBClasses doesn't exist");
  2418.             if (SvOK(name)) {
  2419.                 (void)SvPV(name,len);
  2420.                 s = hv_fetch(h, SvPV(name,na), len, 0);
  2421.             }
  2422.             if (!s)
  2423.                 s = hv_fetch(h, "", 0, 0);
  2424.             if (!s)
  2425.                 croak("Default DBClass not defined");
  2426.             SvREFCNT_inc(*s);
  2427.             if (self->Class)
  2428.                 SvREFCNT_dec(self->Class);
  2429.             self->Class = *s;
  2430.         }
  2431.         RETVAL = newSVsv(self->Class);
  2432.     }
  2433.     OUTPUT:
  2434.     RETVAL
  2435.  
  2436. Result
  2437. close(self)
  2438.     PDA::Pilot::DLP::DB *    self
  2439.     CODE:
  2440.     RETVAL = dlp_CloseDB(self->socket, self->handle);
  2441.     self->handle=0;
  2442.     OUTPUT:
  2443.     RETVAL
  2444.  
  2445. Result
  2446. setSortBlock(self, data)
  2447.     PDA::Pilot::DLP::DB *    self
  2448.     SV *    data
  2449.     CODE:
  2450.     {
  2451.         STRLEN len;
  2452.         void * c;
  2453.         PackSI;
  2454.         c = SvPV(data, len);
  2455.         RETVAL = dlp_WriteSortBlock(self->socket, self->handle, c, len);
  2456.     }
  2457.     OUTPUT:
  2458.     RETVAL
  2459.  
  2460. SV *
  2461. getAppBlock(self, len=0xffff, offset=0)
  2462.     PDA::Pilot::DLP::DB *    self
  2463.     int len
  2464.     int    offset
  2465.     PPCODE:
  2466.     {
  2467.         int result = dlp_ReadAppBlock(self->socket, self->handle, offset, mybuf, len);
  2468.         ReturnReadAI(mybuf, result);
  2469.     }
  2470.  
  2471. SV *
  2472. getSortBlock(self, len=0xffff, offset=0)
  2473.     PDA::Pilot::DLP::DB *    self
  2474.     int len
  2475.     int    offset
  2476.     PPCODE:
  2477.     {
  2478.         int result = dlp_ReadSortBlock(self->socket,self->handle, offset, mybuf, len);
  2479.         ReturnReadSI(mybuf, result);
  2480.     }
  2481.  
  2482. Result
  2483. setAppBlock(self, data)
  2484.     PDA::Pilot::DLP::DB *    self
  2485.     SV *    data
  2486.     CODE:
  2487.     {
  2488.         STRLEN len;
  2489.         void * c;
  2490.         PackAI;
  2491.         c = SvPV(data, len);
  2492.         RETVAL = dlp_WriteAppBlock(self->socket, self->handle, c, len);
  2493.     }
  2494.     OUTPUT:
  2495.     RETVAL
  2496.  
  2497. Result
  2498. purge(self)
  2499.     PDA::Pilot::DLP::DB *    self
  2500.     CODE:
  2501.     RETVAL = dlp_CleanUpDatabase(self->socket, self->handle);
  2502.     OUTPUT:
  2503.     RETVAL
  2504.  
  2505. Result
  2506. resetFlags(self)
  2507.     PDA::Pilot::DLP::DB *    self
  2508.     CODE:
  2509.     RETVAL = dlp_ResetSyncFlags(self->socket, self->handle);
  2510.     OUTPUT:
  2511.     RETVAL
  2512.  
  2513. Result
  2514. deleteCategory(self, category)
  2515.     PDA::Pilot::DLP::DB *    self
  2516.     int    category
  2517.     CODE:
  2518.     RETVAL = dlp_DeleteCategory(self->socket, self->handle, category);
  2519.     OUTPUT:
  2520.     RETVAL
  2521.  
  2522. void
  2523. newRecord(self, id=0, attr=0, cat=0)
  2524.     PDA::Pilot::DLP::DB *    self
  2525.     SV *    id
  2526.     SV *    attr
  2527.     SV *    cat
  2528.     PPCODE:
  2529.     {
  2530.         if (self->Class) {                                    
  2531.             int count;                                        
  2532.             PUSHMARK(sp);                                    
  2533.             XPUSHs(self->Class);
  2534.             if (id)
  2535.                 XPUSHs(id);
  2536.             if (attr)
  2537.                 XPUSHs(attr);
  2538.             if (cat)
  2539.                 XPUSHs(cat);
  2540.             PUTBACK;                                        
  2541.             count = perl_call_method("record", G_SCALAR);
  2542.             SPAGAIN;                                        
  2543.             if (count != 1)                                    
  2544.                 croak("Unable to create record");            
  2545.         }                                                    
  2546.         else {                                                
  2547.             croak("Class not defined");                        
  2548.         }                                                    
  2549.     }
  2550.  
  2551. void
  2552. newResource(self, type=0, id=0)
  2553.     PDA::Pilot::DLP::DB *    self
  2554.     SV *    type
  2555.     SV *    id
  2556.     PPCODE:
  2557.     {
  2558.         if (self->Class) {                                    
  2559.             int count;                                        
  2560.             PUSHMARK(sp);                                    
  2561.             XPUSHs(self->Class);                            
  2562.             if (type)    
  2563.                 XPUSHs(type);
  2564.             if (id)
  2565.                 XPUSHs(id);
  2566.             PUTBACK;                                        
  2567.             count = perl_call_method("resource", G_SCALAR);
  2568.             SPAGAIN;                                        
  2569.             if (count != 1)                                    
  2570.                 croak("Unable to create record");            
  2571.         }                                                    
  2572.         else {                                                
  2573.             croak("Class not defined");                        
  2574.         }                                                    
  2575.     }
  2576.  
  2577. void
  2578. newAppBlock(self)
  2579.     PDA::Pilot::DLP::DB *    self
  2580.     PPCODE:
  2581.     {
  2582.         if (self->Class) {                                    
  2583.             int count;                                        
  2584.             PUSHMARK(sp);                                    
  2585.             XPUSHs(self->Class);                            
  2586.             PUTBACK;                                        
  2587.             count = perl_call_method("appblock", G_SCALAR);
  2588.             SPAGAIN;                                        
  2589.             if (count != 1)                                    
  2590.                 croak("Unable to create record");            
  2591.         }                                                    
  2592.         else {                                                
  2593.             croak("Class not defined");                        
  2594.         }                                                    
  2595.     }
  2596.  
  2597. void
  2598. newSortBlock(self)
  2599.     PDA::Pilot::DLP::DB *    self
  2600.     PPCODE:
  2601.     {
  2602.         if (self->Class) {                                    
  2603.             int count;                                        
  2604.             PUSHMARK(sp);                                    
  2605.             XPUSHs(self->Class);                            
  2606.             PUTBACK;                                        
  2607.             count = perl_call_method("sortblock", G_SCALAR);
  2608.             SPAGAIN;                                        
  2609.             if (count != 1)                                    
  2610.                 croak("Unable to create record");            
  2611.         }                                                    
  2612.         else {                                                
  2613.             croak("Class not defined");                        
  2614.         }                                                    
  2615.     }
  2616.  
  2617. void
  2618. newPref(self, id=0, version=0, backup=0, creator=0)
  2619.     PDA::Pilot::DLP::DB *    self
  2620.     SV *    id
  2621.     SV *    version
  2622.     SV *    backup
  2623.     SV *    creator
  2624.     PPCODE:
  2625.     {
  2626.         if (!creator) {
  2627.             int count;
  2628.             PUSHMARK(sp);
  2629.             XPUSHs(self->Class);
  2630.             PUTBACK;
  2631.             count = perl_call_method("creator", G_SCALAR);
  2632.             SPAGAIN;
  2633.             if (count != 1)
  2634.                 croak("Unable to get creator");
  2635.             creator = POPs;
  2636.             PUTBACK;
  2637.         }
  2638.         if (self->Class) {                                    
  2639.             int count;                                        
  2640.             PUSHMARK(sp);                                    
  2641.             XPUSHs(self->Class);
  2642.             if (creator)
  2643.                 XPUSHs(creator);
  2644.             if (id)
  2645.                 XPUSHs(id);
  2646.             if (version)
  2647.                 XPUSHs(version);
  2648.             if (backup)
  2649.                 XPUSHs(backup);
  2650.             PUTBACK;                                        
  2651.             count = perl_call_method("pref", G_SCALAR);
  2652.             SPAGAIN;                                        
  2653.             if (count != 1)                                    
  2654.                 croak("Unable to create record");            
  2655.         }                                                    
  2656.         else {                                                
  2657.             croak("Class not defined");                        
  2658.         }                                                    
  2659.     }
  2660.  
  2661. void
  2662. getRecord(self, index)
  2663.     PDA::Pilot::DLP::DB *    self
  2664.     int    index
  2665.     PPCODE:
  2666.     {
  2667.         int attr, category;
  2668.         unsigned long id;
  2669.         int size, result;
  2670.         result = dlp_ReadRecordByIndex(self->socket, self->handle, index, mybuf, &id, &size, &attr, &category);
  2671.         ReturnReadRecord(mybuf,size);
  2672.     }
  2673.  
  2674. Result
  2675. moveCategory(self, fromcat, tocat)
  2676.     PDA::Pilot::DLP::DB *    self
  2677.     int    fromcat
  2678.     int    tocat
  2679.     CODE:
  2680.     RETVAL = dlp_MoveCategory(self->socket, self->handle, fromcat, tocat);
  2681.     OUTPUT:
  2682.     RETVAL
  2683.  
  2684.  
  2685. Result
  2686. deleteRecord(self, id)
  2687.     PDA::Pilot::DLP::DB *    self
  2688.     unsigned long    id
  2689.     CODE:
  2690.     RETVAL = dlp_DeleteRecord(self->socket, self->handle, 0, id);
  2691.     OUTPUT:
  2692.     RETVAL
  2693.  
  2694.  
  2695. Result
  2696. deleteRecords(self)
  2697.     PDA::Pilot::DLP::DB *    self
  2698.     CODE:
  2699.     RETVAL = dlp_DeleteRecord(self->socket, self->handle, 1, 0);
  2700.     OUTPUT:
  2701.     RETVAL
  2702.  
  2703. Result
  2704. resetNext(self)
  2705.     PDA::Pilot::DLP::DB *    self
  2706.     CODE:
  2707.     RETVAL = dlp_ResetDBIndex(self->socket, self->handle);
  2708.     OUTPUT:
  2709.     RETVAL
  2710.  
  2711. int
  2712. getRecords(self)
  2713.     PDA::Pilot::DLP::DB *    self
  2714.     CODE:
  2715.     {
  2716.         int result = dlp_ReadOpenDBInfo(self->socket, self->handle, &RETVAL);
  2717.         if (result < 0) {
  2718.             RETVAL = -1;
  2719.             self->errno = result;
  2720.         }
  2721.     }
  2722.     OUTPUT:
  2723.     RETVAL
  2724.  
  2725. void
  2726. getRecordIDs(self, sort=0)
  2727.     PDA::Pilot::DLP::DB *    self
  2728.     int    sort
  2729.     PPCODE:
  2730.     {
  2731.         recordid_t * id = (recordid_t*)mybuf;
  2732.         int result;
  2733.         int start;
  2734.         int count;
  2735.         int i;
  2736.         AV * list = newAV();
  2737.         
  2738.         start = 0;
  2739.         for(;;) {
  2740.             result = dlp_ReadRecordIDList(self->socket, self->handle, sort, start,
  2741.                 0xFFFF/sizeof(recordid_t), id, &count);
  2742.             if (result < 0) {
  2743.                 self->errno = result;
  2744.                 break;
  2745.             } else {
  2746.                 for(i=0;i<count;i++) {
  2747.                     EXTEND(sp,1);
  2748.                     PUSHs(sv_2mortal(newSViv(id[i])));
  2749.                 }
  2750.                 if (count == (0xFFFF/sizeof(recordid_t)))
  2751.                     start = count;
  2752.                 else
  2753.                     break;
  2754.             }
  2755.         }
  2756.     }
  2757.  
  2758. void
  2759. getRecordByID(self, id)
  2760.     PDA::Pilot::DLP::DB *    self
  2761.     unsigned long id
  2762.     PPCODE:
  2763.     {
  2764.         int size, result, attr, category, index;
  2765.         result = dlp_ReadRecordById(self->socket, self->handle, id, mybuf, &index, &size, &attr, &category);
  2766.         ReturnReadRecord(mybuf,size);
  2767.     }
  2768.  
  2769. void
  2770. getNextModRecord(self, category=-1)
  2771.     PDA::Pilot::DLP::DB *    self
  2772.     int    category
  2773.     PPCODE:
  2774.     {
  2775.         int size, result, attr, index, category;
  2776.         unsigned long id;
  2777.         if (category == -1)
  2778.             result = dlp_ReadNextModifiedRec(self->socket, self->handle, mybuf, &id, &index, &size, &attr, &category);
  2779.         else
  2780.             result = dlp_ReadNextModifiedRecInCategory(self->socket, self->handle, category, mybuf, &id, &index, &size, &attr);
  2781.         ReturnReadRecord(mybuf,size);
  2782.     }
  2783.  
  2784. void
  2785. getNextRecord(self, category)
  2786.     PDA::Pilot::DLP::DB *    self
  2787.     int    category
  2788.     PPCODE:
  2789.     {
  2790.         int size, result, attr, index;
  2791.         unsigned long id;
  2792.         result = dlp_ReadNextRecInCategory(self->socket, self->handle, category, mybuf, &id, &index, &size, &attr);
  2793.         ReturnReadRecord(mybuf,size);
  2794.     }
  2795.  
  2796. unsigned long
  2797. setRecord(self, data)
  2798.     PDA::Pilot::DLP::DB *    self
  2799.     SV *    data
  2800.     CODE:
  2801.     {
  2802.         STRLEN len;
  2803.         unsigned long id;
  2804.         int attr, category;
  2805.         int result;
  2806.         void * c;
  2807.         PackRecord;
  2808.         c = SvPV(data, len);
  2809.         result = dlp_WriteRecord(self->socket, self->handle, attr, id, category, c, len, &RETVAL);
  2810.         if (result<0) {
  2811.             RETVAL = 0;
  2812.             self->errno = result;
  2813.         }
  2814.     }
  2815.     OUTPUT:
  2816.     RETVAL
  2817.  
  2818. unsigned long
  2819. setRecordRaw(self, data, id, attr, category)
  2820.     PDA::Pilot::DLP::DB *    self
  2821.     unsigned long    id
  2822.     int    attr
  2823.     int    category
  2824.     SV *    data
  2825.     CODE:
  2826.     {
  2827.         STRLEN len;
  2828.         int result;
  2829.         void * c;
  2830.         PackRaw;
  2831.         c = SvPV(data, len);
  2832.         result = dlp_WriteRecord(self->socket, self->handle, attr, id, category, c, len, &RETVAL);
  2833.         if (result<0) {
  2834.             RETVAL = 0;
  2835.             self->errno = result;
  2836.         }
  2837.     }
  2838.     OUTPUT:
  2839.     RETVAL
  2840.  
  2841. void
  2842. setResourceByID(self, type, id)
  2843.     PDA::Pilot::DLP::DB *    self
  2844.     Char4    type
  2845.     int    id
  2846.     PPCODE:
  2847.     {
  2848.         int size, result, index;
  2849.         result = dlp_ReadResourceByType(self->socket, self->handle, type, id, mybuf, &index, &size);
  2850.         ReturnReadResource(mybuf,size);
  2851.     }
  2852.  
  2853. void
  2854. getResource(self, index)
  2855.     PDA::Pilot::DLP::DB *    self
  2856.     int    index
  2857.     PPCODE:
  2858.     {
  2859.         int size, result, id;
  2860.         Char4 type;
  2861.         result = dlp_ReadResourceByIndex(self->socket, self->handle, index, mybuf, &type, &id, &size);
  2862.         ReturnReadResource(mybuf,size);
  2863.     }
  2864.  
  2865. SV *
  2866. setResource(self, data)
  2867.     PDA::Pilot::DLP::DB *    self
  2868.     SV *    data
  2869.     CODE:
  2870.     {
  2871.         STRLEN len;
  2872.         int result;
  2873.         Char4 type;
  2874.         int id;
  2875.         void * c;
  2876.         PackResource;
  2877.         c = SvPV(data, len);
  2878.         result = dlp_WriteResource(self->socket, self->handle, type, id, c, len);
  2879.         if (result < 0) {
  2880.             self->errno = result;
  2881.             RETVAL = newSVsv(&sv_undef);
  2882.         } else
  2883.             RETVAL = newSViv(result);
  2884.     }
  2885.     OUTPUT:
  2886.     RETVAL
  2887.  
  2888. Result
  2889. deleteResource(self, type, id)
  2890.     PDA::Pilot::DLP::DB *    self
  2891.     Char4    type
  2892.     int    id
  2893.     CODE:
  2894.     RETVAL = dlp_DeleteResource(self->socket, self->handle, 0, type, id);
  2895.     OUTPUT:
  2896.     RETVAL
  2897.  
  2898. Result
  2899. deleteResources(self)
  2900.     PDA::Pilot::DLP::DB *    self
  2901.     CODE:
  2902.     RETVAL = dlp_DeleteResource(self->socket, self->handle, 1, 0, 0);
  2903.     OUTPUT:
  2904.     RETVAL
  2905.  
  2906. void
  2907. getPref(self, id=0, backup=1)
  2908.     PDA::Pilot::DLP::DB *    self
  2909.     int    id
  2910.     int    backup
  2911.     PPCODE:
  2912.     {
  2913.         Char4 creator;
  2914.         int len, version, result;
  2915.         SV * c, n, v;
  2916.         int r;
  2917.         if (self->Class) {
  2918.             int count;
  2919.             PUSHMARK(sp);
  2920.             XPUSHs(self->Class);
  2921.             PUTBACK;
  2922.             count = perl_call_method("creator", G_SCALAR);
  2923.             SPAGAIN;
  2924.             if (count != 1)
  2925.                 croak("Unable to get creator");
  2926.             creator = SvChar4(POPs);
  2927.             PUTBACK;
  2928.         }
  2929.         if (pi_version(self->socket)< 0x101)
  2930.             r = dlp_CloseDB(self->socket, self->handle);
  2931.         result = dlp_ReadAppPreference(self->socket, creator, id, backup, 0xFFFF, mybuf, &len, &version);
  2932.         if (pi_version(self->socket)< 0x101)
  2933.             r = dlp_OpenDB(self->socket, self->dbcard, self->dbmode, SvPV(self->dbname,na), &self->handle);
  2934.         ReturnReadPref(mybuf, len);
  2935.     }
  2936.  
  2937. SV *
  2938. setPref(self, data)
  2939.     PDA::Pilot::DLP::DB *    self
  2940.     SV *    data
  2941.     PPCODE:
  2942.     {
  2943.         Char4    creator;
  2944.         int id;
  2945.         int    version;
  2946.         int    backup;
  2947.         STRLEN len;
  2948.         int result;
  2949.         void * buf;
  2950.         int r;
  2951.         PackPref;
  2952.         buf = SvPV(data, len);
  2953.         if (pi_version(self->socket)< 0x101)
  2954.             r = dlp_CloseDB(self->socket, self->handle);
  2955.         result = dlp_WriteAppPreference(self->socket, creator, id, backup, version, buf, len);
  2956.         if (pi_version(self->socket)< 0x101)
  2957.             r = dlp_OpenDB(self->socket, self->dbcard, self->dbmode, SvPV(self->dbname,na), &self->handle);
  2958.         if (result < 0) {
  2959.             self->errno = result;
  2960.             RETVAL = newSVsv(&sv_undef);
  2961.         } else {
  2962.             RETVAL = newSViv(result);
  2963.         }
  2964.     }
  2965.  
  2966. SV *
  2967. setPrefRaw(self, data, number, version, backup=1)
  2968.     PDA::Pilot::DLP::DB *    self
  2969.     SV *    data
  2970.     int    number
  2971.     int    version
  2972.     int    backup
  2973.     PPCODE:
  2974.     {
  2975.         STRLEN len;
  2976.         Char4 creator;
  2977.         int version, result;
  2978.         void * buf;
  2979.         PackRaw;
  2980.         buf = SvPV(data, len);
  2981.         if (self->Class) {
  2982.             int count;
  2983.             PUSHMARK(sp);
  2984.             XPUSHs(self->Class);
  2985.             PUTBACK;
  2986.             count = perl_call_method("creator", G_SCALAR);
  2987.             SPAGAIN;
  2988.             if (count != 1)
  2989.                 croak("Unable to get creator");
  2990.             creator = SvChar4(POPs);
  2991.             PUTBACK;
  2992.         }
  2993.         result = dlp_WriteAppPreference(self->socket, creator, number, backup, version, buf, len);
  2994.         if (result < 0) {
  2995.             self->errno = result;
  2996.             RETVAL = newSVsv(&sv_undef);
  2997.         } else {
  2998.             RETVAL = newSViv(result);
  2999.         }
  3000.     }
  3001.  
  3002.  
  3003. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot::DLPPtr
  3004.  
  3005. void
  3006. DESTROY(self)
  3007.     PDA::Pilot::DLP *    self
  3008.     CODE:
  3009.     if (self->socket)
  3010.         pi_close(self->socket);
  3011.     free(self);
  3012.  
  3013. int
  3014. errno(self)
  3015.     PDA::Pilot::DLP *    self
  3016.     CODE:
  3017.         RETVAL = self->errno;
  3018.         self->errno = 0;
  3019.     OUTPUT:
  3020.     RETVAL
  3021.  
  3022. SV *
  3023. getTime(self)
  3024.     PDA::Pilot::DLP *    self
  3025.     CODE:
  3026.     {
  3027.         time_t t;
  3028.         int result = dlp_GetSysDateTime(self->socket, &t);
  3029.         if (result < 0) {
  3030.             self->errno = result;
  3031.             RETVAL = newSVsv(&sv_undef);
  3032.         } else
  3033.             RETVAL = newSViv(t);
  3034.     }
  3035.     OUTPUT:
  3036.     RETVAL
  3037.  
  3038. Result
  3039. setTime(self, time)
  3040.     PDA::Pilot::DLP *    self
  3041.     long    time
  3042.     CODE:
  3043.     RETVAL = dlp_SetSysDateTime(self->socket, time);
  3044.     OUTPUT:
  3045.     RETVAL
  3046.  
  3047. SV *
  3048. getSysInfo(self)
  3049.     PDA::Pilot::DLP *    self
  3050.     CODE:
  3051.     {
  3052.         struct SysInfo si;
  3053.         int result = dlp_ReadSysInfo(self->socket, &si);
  3054.         if (result < 0) {
  3055.             self->errno = result;
  3056.             RETVAL = newSVsv(&sv_undef);
  3057.         } else {
  3058.             HV * i = newHV();
  3059.             hv_store(i, "romVersion", 10, newSViv(si.romVersion), 0);    \
  3060.             hv_store(i, "locale", 6, newSViv(si.locale), 0);    \
  3061.             hv_store(i, "name", 4, newSVpv(si.name, si.nameLength), 0);    \
  3062.             RETVAL = newRV((SV*)i);
  3063.         }
  3064.     }
  3065.     OUTPUT:
  3066.     RETVAL
  3067.  
  3068. SV *
  3069. getCardInfo(self, cardno=0)
  3070.     PDA::Pilot::DLP *    self
  3071.     int    cardno
  3072.     CODE:
  3073.     {
  3074.         struct CardInfo c;
  3075.         int result = dlp_ReadStorageInfo(self->socket, cardno, &c);
  3076.         if (result < 0) {
  3077.             self->errno = result;
  3078.             RETVAL = newSVsv(&sv_undef);
  3079.         } else {
  3080.             HV * i = newHV();
  3081.             hv_store(i, "card", 6, newSViv(c.card), 0);    \
  3082.             hv_store(i, "version", 7, newSViv(c.version), 0);    \
  3083.             hv_store(i, "created", 8, newSViv(c.creation), 0);    \
  3084.             hv_store(i, "romSize", 7, newSViv(c.romSize), 0);    \
  3085.             hv_store(i, "ramSize", 7, newSViv(c.ramSize), 0);    \
  3086.             hv_store(i, "ramFree", 7, newSViv(c.ramFree), 0);    \
  3087.             hv_store(i, "name", 4, newSVpv(c.name,0), 0);    \
  3088.             hv_store(i, "manufacturer", 12, newSVpv(c.manufacturer,0), 0);    \
  3089.             RETVAL = newRV((SV*)i);
  3090.         }
  3091.     }
  3092.     OUTPUT:
  3093.     RETVAL
  3094.  
  3095. int
  3096. setUserInfo(self, info)
  3097.     PDA::Pilot::DLP *    self
  3098.     UserInfo    &info
  3099.     CODE:
  3100.     RETVAL = dlp_WriteUserInfo(self->socket, &info);
  3101.     OUTPUT:
  3102.     RETVAL
  3103.  
  3104. void
  3105. getBattery(self)
  3106.     PDA::Pilot::DLP *    self
  3107.     PPCODE:
  3108.     {
  3109.         int warn, critical, ticks, kind, AC;
  3110.         unsigned long voltage;
  3111.         int result;
  3112.         struct RPC_params p;
  3113.         
  3114.         PackRPC(&p,0xA0B6, RPC_IntReply,
  3115.             RPC_Byte(0), RPC_ShortPtr(&warn), RPC_ShortPtr(&critical),
  3116.             RPC_ShortPtr(&ticks), RPC_BytePtr(&kind), RPC_BytePtr(&AC), RPC_End);
  3117.             
  3118.         result = dlp_RPC(self->socket, &p, &voltage);
  3119.  
  3120.         if (result==0) {
  3121.             EXTEND(sp,5);
  3122.             PUSHs(sv_2mortal(newSVnv((float)voltage/100)));
  3123.             PUSHs(sv_2mortal(newSVnv((float)warn/100)));
  3124.             PUSHs(sv_2mortal(newSVnv((float)critical/100)));
  3125.             PUSHs(sv_2mortal(newSViv(kind)));
  3126.             PUSHs(sv_2mortal(newSViv(AC)));
  3127.         }
  3128.     }
  3129.  
  3130. SV *
  3131. getUserInfo(self)
  3132.     PDA::Pilot::DLP *    self
  3133.     CODE:
  3134.     {
  3135.         UserInfo info;
  3136.         int result;
  3137.         result = dlp_ReadUserInfo(self->socket, &info);
  3138.         pack_userinfo(RETVAL, info, result);
  3139.     }
  3140.     OUTPUT:
  3141.     RETVAL
  3142.  
  3143. void
  3144. newPref(self, creator, id=0, version=0, backup=0)
  3145.     PDA::Pilot::DLP *    self
  3146.     Char4    creator
  3147.     SV *    id
  3148.     SV *    version
  3149.     SV *    backup
  3150.     PPCODE:
  3151.     {
  3152.         HV * h = perl_get_hv("PDA::Pilot::PrefClasses", 0);
  3153.         SV ** s;                                        
  3154.            int count;                                            
  3155.         if (!h)                                                
  3156.             croak("PrefClasses doesn't exist");                
  3157.         s = hv_fetch(h, printlong(creator), 4, 0);            
  3158.         if (!s)                                                
  3159.             s = hv_fetch(h, "", 0, 0);                        
  3160.         if (!s)                                                
  3161.             croak("Default PrefClass not defined");            
  3162.            PUSHMARK(sp);                                        
  3163.            XPUSHs(newSVsv(*s));                                
  3164.            XPUSHs(&sv_undef);                                    
  3165.         XPUSHs(sv_2mortal(newSVChar4(creator)));            
  3166.         if (id)
  3167.             XPUSHs(id);                    
  3168.         if (version)
  3169.             XPUSHs(version);                
  3170.         if (backup)
  3171.             XPUSHs(backup);
  3172.         PUTBACK;                                            
  3173.         count = perl_call_method("pref", G_SCALAR);            
  3174.         SPAGAIN;                                            
  3175.         if (count != 1)                                        
  3176.             croak("Unable to create resource");                
  3177.     }
  3178.  
  3179. Result
  3180. delete(self, name, cardno=0)
  3181.     PDA::Pilot::DLP *    self
  3182.     char *    name
  3183.     int    cardno
  3184.     CODE:
  3185.     {
  3186.         UserInfo info;
  3187.         int result;
  3188.         RETVAL = dlp_DeleteDB(self->socket, cardno, name);
  3189.     }
  3190.     OUTPUT:
  3191.     RETVAL
  3192.  
  3193. SV *
  3194. open(self, name, mode=0, cardno=0)
  3195.     PDA::Pilot::DLP *    self
  3196.     char *    name
  3197.     SV *    mode
  3198.     int    cardno
  3199.     CODE:
  3200.     {
  3201.         int handle;
  3202.         int nummode;
  3203.         int result;
  3204.         if (!mode)
  3205.             nummode = dlpOpenRead|dlpOpenWrite|dlpOpenSecret;
  3206.         else {
  3207.             char *c;
  3208.             int len;
  3209.             nummode = SvIV(mode);
  3210.             if (SvPOKp(mode)) {
  3211.                 c = SvPV(mode, len);
  3212.                 while (*c) {
  3213.                     switch (*c) {
  3214.                     case 'r':
  3215.                         nummode |= dlpOpenRead;
  3216.                         break;
  3217.                     case 'w':
  3218.                         nummode |= dlpOpenWrite;
  3219.                         break;
  3220.                     case 'x':
  3221.                         nummode |= dlpOpenExclusive;
  3222.                         break;
  3223.                     case 's':
  3224.                         nummode |= dlpOpenSecret;
  3225.                         break;
  3226.                     }
  3227.                     c++;
  3228.                 }
  3229.             }
  3230.         }
  3231.         result = dlp_OpenDB(self->socket, cardno, nummode, name, &handle);
  3232.         if (result<0) {
  3233.             self->errno = result;
  3234.             RETVAL = &sv_undef;
  3235.         } else {
  3236.             int type;
  3237.             PDA__Pilot__DLP__DB * x = malloc(sizeof(PDA__Pilot__DLP__DB));
  3238.             SV * sv = newSViv((IV)(void*)x);
  3239.             SvREFCNT_inc(ST(0));
  3240.             x->connection = ST(0);
  3241.             x->socket = self->socket;
  3242.             x->handle = handle;
  3243.             x->errno = 0;
  3244.             x->dbname = newSVpv(name,0);
  3245.             x->dbmode = nummode;
  3246.             x->dbcard = cardno;
  3247.             RETVAL = newRV(sv);
  3248.             SvREFCNT_dec(sv);
  3249.             sv_bless(RETVAL, gv_stashpv("PDA::Pilot::DLP::DBPtr",0));
  3250.             {
  3251.                 HV * h = perl_get_hv("PDA::Pilot::DBClasses", 0);
  3252.                 SV ** s;
  3253.                 if (!h)
  3254.                     croak("DBClasses doesn't exist");
  3255.                 s = hv_fetch(h, name, strlen(name), 0);
  3256.                 if (!s)
  3257.                     s = hv_fetch(h, "", 0, 0);
  3258.                 if (!s)
  3259.                     croak("Default DBClass not defined");
  3260.                 x->Class = *s; 
  3261.                 SvREFCNT_inc(*s);
  3262.             }
  3263.         }
  3264.     }
  3265.     OUTPUT:
  3266.     RETVAL
  3267.  
  3268. SV *
  3269. create(self, name, creator, type, flags, version, cardno=0)
  3270.     PDA::Pilot::DLP *    self
  3271.     char *    name
  3272.     Char4    creator
  3273.     Char4    type
  3274.     int    flags
  3275.     int    version
  3276.     int    cardno
  3277.     CODE:
  3278.     {
  3279.         int handle;
  3280.         int result = dlp_CreateDB(self->socket, creator, type, cardno, flags, version, name, &handle);
  3281.         if (result<0) {
  3282.             self->errno = result;
  3283.             RETVAL = &sv_undef;
  3284.         } else {
  3285.             PDA__Pilot__DLP__DB * x = malloc(sizeof(PDA__Pilot__DLP__DB));
  3286.             SV * sv = newSViv((IV)(void*)x);
  3287.             SvREFCNT_inc(ST(0));
  3288.             x->connection = ST(0);
  3289.             x->socket = self->socket;
  3290.             x->handle = handle;
  3291.             x->errno = 0;
  3292.             x->dbname = newSVpv(name,0);
  3293.             x->dbmode = dlpOpenRead|dlpOpenWrite|dlpOpenSecret;
  3294.             x->dbcard = cardno;
  3295.             RETVAL = newRV(sv);
  3296.             SvREFCNT_dec(sv);
  3297.             sv_bless(RETVAL, gv_stashpv("PDA::Pilot::DLP::DBPtr",0));
  3298.             {
  3299.                 HV * h = perl_get_hv("PDA::Pilot::DBClasses", 0);
  3300.                 SV ** s;
  3301.                 if (!h)
  3302.                     croak("DBClasses doesn't exist");
  3303.                 s = hv_fetch(h, name, strlen(name), 0);
  3304.                 if (!s)
  3305.                     s = hv_fetch(h, "", 0, 0);
  3306.                 if (!s)
  3307.                     croak("Default DBClass not defined");
  3308.                 x->Class = *s; 
  3309.                 SvREFCNT_inc(*s);
  3310.             }
  3311.         }
  3312.     }
  3313.     OUTPUT:
  3314.     RETVAL
  3315.  
  3316.  
  3317.  
  3318. void
  3319. getPref(self, creator, id=0, backup=1)
  3320.     PDA::Pilot::DLP *    self
  3321.     Char4    creator
  3322.     int    id
  3323.     int    backup
  3324.     PPCODE:
  3325.     {
  3326.         int len, version, result;
  3327.         SV * c, n, v;
  3328.         result = dlp_ReadAppPreference(self->socket, creator, id, backup, 0xFFFF, mybuf, &len, &version);
  3329.         ReturnReadPref(mybuf, len);
  3330.     }
  3331.  
  3332. SV *
  3333. setPref(self, data)
  3334.     PDA::Pilot::DLP *    self
  3335.     SV *    data
  3336.     PPCODE:
  3337.     {
  3338.         Char4    creator;
  3339.         int id;
  3340.         int    version;
  3341.         int    backup;
  3342.         STRLEN len;
  3343.         int result;
  3344.         void * buf;
  3345.         PackPref;
  3346.         buf = SvPV(data, len);
  3347.         result = dlp_WriteAppPreference(self->socket, creator, id, backup, version, buf, len);
  3348.         if (result < 0) {
  3349.             self->errno = result;
  3350.             RETVAL = newSVsv(&sv_undef);
  3351.         } else {
  3352.             RETVAL = newSViv(result);
  3353.         }
  3354.     }
  3355.  
  3356. SV *
  3357. setPrefRaw(self, data, creator, number, version, backup=1)
  3358.     PDA::Pilot::DLP *    self
  3359.     SV *    data
  3360.     Char4    creator
  3361.     int    number
  3362.     int    version
  3363.     int    backup
  3364.     PPCODE:
  3365.     {
  3366.         STRLEN len;
  3367.         int version, result;
  3368.         void * buf;
  3369.         PackRaw;
  3370.         buf = SvPV(data, len);
  3371.         result = dlp_WriteAppPreference(self->socket, creator, number, backup, version, buf, len);
  3372.         if (result < 0) {
  3373.             self->errno = result;
  3374.             RETVAL = newSVsv(&sv_undef);
  3375.         } else {
  3376.             RETVAL = newSViv(result);
  3377.         }
  3378.     }
  3379.  
  3380.  
  3381. Result
  3382. close(self, status=0)
  3383.     PDA::Pilot::DLP *    self
  3384.     int    status
  3385.     CODE:
  3386.     RETVAL = dlp_EndOfSync(self->socket, status) || pi_close(self->socket);
  3387.     if (!RETVAL)
  3388.         self->socket = 0;
  3389.     OUTPUT:
  3390.     RETVAL
  3391.  
  3392. Result
  3393. abort(self)
  3394.     PDA::Pilot::DLP *    self
  3395.     CODE:
  3396.     RETVAL = dlp_AbortSync(self->socket) || pi_close(self->socket);
  3397.     if (!RETVAL)
  3398.         self->socket = 0;
  3399.     OUTPUT:
  3400.     RETVAL
  3401.  
  3402. Result
  3403. reset(self)
  3404.     PDA::Pilot::DLP *    self
  3405.     CODE:
  3406.     RETVAL = dlp_ResetSystem(self->socket);
  3407.     OUTPUT:
  3408.     RETVAL
  3409.  
  3410. Result
  3411. getStatus(self)
  3412.     PDA::Pilot::DLP *    self
  3413.     CODE:
  3414.     RETVAL = dlp_OpenConduit(self->socket);
  3415.     OUTPUT:
  3416.     RETVAL
  3417.  
  3418. Result
  3419. log(self, message)
  3420.     PDA::Pilot::DLP *    self
  3421.     char *    message
  3422.     CODE:
  3423.     RETVAL = dlp_AddSyncLogEntry(self->socket,message);
  3424.     OUTPUT:
  3425.     RETVAL
  3426.  
  3427.  
  3428. Result
  3429. dirty(self)
  3430.     PDA::Pilot::DLP *    self
  3431.     CODE:
  3432.     RETVAL = dlp_ResetLastSyncPC(self->socket);
  3433.     OUTPUT:
  3434.     RETVAL
  3435.  
  3436. SV *
  3437. getDBInfo(self, start, RAM=1, ROM=0, cardno=0)
  3438.     PDA::Pilot::DLP *    self
  3439.     int    start
  3440.     int    RAM
  3441.     int    ROM
  3442.     int    cardno
  3443.     CODE:
  3444.     {
  3445.         DBInfo info;
  3446.         int where = (RAM ? dlpDBListRAM : 0) | (ROM ? dlpDBListROM : 0);
  3447.         int result = dlp_ReadDBList(self->socket, cardno, where, start, &info);
  3448.         pack_dbinfo(RETVAL, info, result);
  3449.     }
  3450.     OUTPUT:
  3451.     RETVAL
  3452.  
  3453. SV *
  3454. findDBInfo(self, start, name, creator, type, cardno=0)
  3455.     PDA::Pilot::DLP *    self
  3456.     int    start
  3457.     SV *    name
  3458.     SV *    creator
  3459.     SV *    type
  3460.     int    cardno
  3461.     CODE:
  3462.     {
  3463.         DBInfo info;
  3464.         Char4 c,t;
  3465.         int result;
  3466.         if (SvOK(creator))
  3467.             c = SvChar4(creator);
  3468.         else
  3469.             c = 0;
  3470.         if (SvOK(type))
  3471.             t = SvChar4(type);
  3472.         else
  3473.             t = 0;
  3474.         result = dlp_FindDBInfo(self->socket, cardno, start, 
  3475.             SvOK(name) ? SvPV(name,na) : 0,
  3476.             t, c, &info);
  3477.         pack_dbinfo(RETVAL, info, result);
  3478.     }
  3479.     OUTPUT:
  3480.     RETVAL
  3481.  
  3482. SV *
  3483. getFeature(self, creator, number)
  3484.     PDA::Pilot::DLP *    self
  3485.     Char4    creator
  3486.     int    number
  3487.     CODE:
  3488.     {
  3489.         unsigned long f;
  3490.         int result;
  3491.         if ((result = dlp_ReadFeature(self->socket, creator, number, &f))<0) {
  3492.             RETVAL = newSVsv(&sv_undef);
  3493.             self->errno = result;
  3494.         } else {
  3495.             RETVAL = newSViv(f);
  3496.         }
  3497.     }
  3498.     OUTPUT:
  3499.     RETVAL
  3500.  
  3501.  
  3502. void
  3503. callApplication(self, creator, type, action, data=&sv_undef, maxretlen=0xFFFF)
  3504.     PDA::Pilot::DLP *    self
  3505.     Char4    creator
  3506.     Char4    type
  3507.     int    action
  3508.     SV *    data
  3509.     int    maxretlen
  3510.     PPCODE:
  3511.     {
  3512.         unsigned long retcode;
  3513.         STRLEN len;
  3514.         int result;
  3515.         (void)SvPV(data,len);
  3516.         result = dlp_CallApplication(self->socket, creator, type, action, len, SvPV(data,len),
  3517.                             &retcode, maxretlen, &len, mybuf);
  3518.         EXTEND(sp, 2);
  3519.         if (result >= 0) {
  3520.             PUSHs(sv_2mortal(newSVpv(mybuf, len)));
  3521.             if (GIMME != G_SCALAR) {
  3522.                 PUSHs(sv_2mortal(newSViv(retcode)));
  3523.             }
  3524.         } else
  3525.             PUSHs(&sv_undef);
  3526.     }
  3527.  
  3528. int
  3529. tickle(self)
  3530.     PDA::Pilot::DLP *    self
  3531.     CODE:
  3532.     {
  3533.         RETVAL = pi_tickle(self->socket);
  3534.     }
  3535.     OUTPUT:
  3536.     RETVAL
  3537.  
  3538. int
  3539. watchdog(self, interval)
  3540.     PDA::Pilot::DLP *    self
  3541.     int interval
  3542.     CODE:
  3543.     {
  3544.         RETVAL = pi_watchdog(self->socket, interval);
  3545.     }
  3546.     OUTPUT:
  3547.     RETVAL
  3548.  
  3549. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot::File
  3550.  
  3551. PDA::Pilot::File *
  3552. open(name)
  3553.     char *    name
  3554.     CODE:
  3555.     {
  3556.         RETVAL = calloc(sizeof(PDA__Pilot__File),1);
  3557.         RETVAL->errno = 0;
  3558.         RETVAL->pf = pi_file_open(name);
  3559.         {
  3560.             HV * h = perl_get_hv("PDA::Pilot::DBClasses", 0);
  3561.             SV ** s;
  3562.             if (!h)
  3563.                 croak("DBClasses doesn't exist");
  3564.             s = hv_fetch(h, name, strlen(name), 0);
  3565.             if (!s)
  3566.                 s = hv_fetch(h, "", 0, 0);
  3567.             if (!s)
  3568.                 croak("Default DBClass not defined");
  3569.             RETVAL->Class = *s; 
  3570.             SvREFCNT_inc(*s);
  3571.         }
  3572.     }
  3573.     OUTPUT:
  3574.     RETVAL
  3575.  
  3576. PDA::Pilot::File *
  3577. create(name, info)
  3578.     char *    name
  3579.     DBInfo    info
  3580.     CODE:
  3581.     RETVAL = calloc(sizeof(PDA__Pilot__File),1);
  3582.     RETVAL->errno = 0;
  3583.     RETVAL->pf = pi_file_create(name, &info);
  3584.     {
  3585.         HV * h = perl_get_hv("PDA::Pilot::DBClasses", 0);
  3586.         SV ** s;
  3587.         if (!h)
  3588.             croak("DBClasses doesn't exist");
  3589.         s = hv_fetch(h, name, strlen(name), 0);
  3590.         if (!s)
  3591.             s = hv_fetch(h, "", 0, 0);
  3592.         if (!s)
  3593.             croak("Default DBClass not defined");
  3594.         RETVAL->Class = *s; 
  3595.         SvREFCNT_inc(*s);
  3596.     }
  3597.     OUTPUT:
  3598.     RETVAL
  3599.  
  3600. MODULE = PDA::Pilot        PACKAGE = PDA::Pilot::FilePtr
  3601.  
  3602. int
  3603. errno(self)
  3604.     PDA::Pilot::File *    self
  3605.     CODE:
  3606.         RETVAL = self->errno;
  3607.         self->errno = 0;
  3608.     OUTPUT:
  3609.     RETVAL
  3610.  
  3611. void
  3612. DESTROY(self)
  3613.     PDA::Pilot::File *    self
  3614.     CODE:
  3615.     if (self->pf)
  3616.         pi_file_close(self->pf);
  3617.     if (self->Class)
  3618.         SvREFCNT_dec(self->Class);
  3619.     free(self);
  3620.  
  3621. SV *
  3622. class(self, name=0)
  3623.     PDA::Pilot::File *    self
  3624.     SV *    name
  3625.     CODE:
  3626.     {
  3627.         SV ** s = 0;
  3628.         HV * h;
  3629.         if (name) {
  3630.             int len;
  3631.             h = perl_get_hv("PDA::Pilot::DBClasses", 0);
  3632.             if (!h)
  3633.                 croak("DBClasses doesn't exist");
  3634.             if (SvOK(name)) {
  3635.                 (void)SvPV(name, len);
  3636.                 s = hv_fetch(h, SvPV(name, na), len, 0);
  3637.             }
  3638.             if (!s)
  3639.                 s = hv_fetch(h, "", 0, 0);
  3640.             if (!s)
  3641.                 croak("Default DBClass not defined");
  3642.             SvREFCNT_inc(*s);
  3643.             if (self->Class)
  3644.                 SvREFCNT_dec(self->Class);
  3645.             self->Class = *s;
  3646.         }
  3647.         RETVAL = newSVsv(self->Class);
  3648.     }
  3649.     OUTPUT:
  3650.     RETVAL
  3651.  
  3652. int
  3653. close(self)
  3654.     PDA::Pilot::File *    self
  3655.     CODE:
  3656.     if (self->pf) {
  3657.         RETVAL = pi_file_close(self->pf);
  3658.         self->pf = 0;
  3659.     } else
  3660.         RETVAL = 0;
  3661.     OUTPUT:
  3662.     RETVAL
  3663.  
  3664. SV *
  3665. getAppBlock(self)
  3666.     PDA::Pilot::File *    self
  3667.     CODE:
  3668.     {
  3669.         int len, result;
  3670.         void * buf;
  3671.         result = pi_file_get_app_info(self->pf, &buf, &len);
  3672.         ReturnReadAI(buf, len);
  3673.     }
  3674.     OUTPUT:
  3675.     RETVAL
  3676.  
  3677. SV *
  3678. getSortBlock(self)
  3679.     PDA::Pilot::File *    self
  3680.     CODE:
  3681.     {
  3682.         int len, result;
  3683.         void * buf;
  3684.         result = pi_file_get_sort_info(self->pf, &buf, &len);
  3685.         ReturnReadSI(buf, len);
  3686.     }
  3687.     OUTPUT:
  3688.     RETVAL
  3689.  
  3690. SV *
  3691. getRecords(self)
  3692.     PDA::Pilot::File *    self
  3693.     CODE:
  3694.     {
  3695.         int len, result;
  3696.         result = pi_file_get_entries(self->pf, &len);
  3697.         if (result) {
  3698.             self->errno = result;
  3699.             RETVAL = &sv_undef;
  3700.         } else
  3701.             RETVAL = newSViv(len);
  3702.     }
  3703.     OUTPUT:
  3704.     RETVAL
  3705.  
  3706. SV *
  3707. getResource(self, index)
  3708.     PDA::Pilot::File *    self
  3709.     int    index
  3710.     CODE:
  3711.     {
  3712.         int len, result, id;
  3713.         Char4 type;
  3714.         void * buf;
  3715.         result = pi_file_read_resource(self->pf, index, &buf, &len, &type, &id);
  3716.         ReturnReadResource(buf,len);
  3717.     }
  3718.     OUTPUT:
  3719.     RETVAL
  3720.  
  3721. SV *
  3722. getRecord(self, index)
  3723.     PDA::Pilot::File *    self
  3724.     int    index
  3725.     CODE:
  3726.     {
  3727.         int len, result, attr, category;
  3728.         unsigned long id;
  3729.         void * buf;
  3730.         result = pi_file_read_record(self->pf, index, &buf, &len, &attr, &category, &id);
  3731.         ReturnReadRecord(buf,len);
  3732.     }
  3733.     OUTPUT:
  3734.     RETVAL
  3735.  
  3736. SV *
  3737. getRecordByID(self, id)
  3738.     PDA::Pilot::File *    self
  3739.     unsigned long    id
  3740.     CODE:
  3741.     {
  3742.         int len, result;
  3743.         int attr, category, index;
  3744.         void * buf;
  3745.         result = pi_file_read_record_by_id(self->pf, id, &buf, &len, &index, &attr, &category);
  3746.         ReturnReadRecord(buf, len);
  3747.     }
  3748.     OUTPUT:
  3749.     RETVAL
  3750.  
  3751. int
  3752. checkID(self, uid)
  3753.     PDA::Pilot::File *    self
  3754.     unsigned long    uid
  3755.     CODE:
  3756.     RETVAL = pi_file_id_used(self->pf, uid);
  3757.     OUTPUT:
  3758.     RETVAL
  3759.  
  3760. SV *
  3761. getDBInfo(self)
  3762.     PDA::Pilot::File *    self
  3763.     CODE:
  3764.     {
  3765.         DBInfo result;
  3766.         int err = pi_file_get_info(self->pf, &result);
  3767.         pack_dbinfo(RETVAL, result, err);
  3768.     }
  3769.     OUTPUT:
  3770.     RETVAL
  3771.  
  3772. int
  3773. setDBInfo(self, info)
  3774.     PDA::Pilot::File *    self
  3775.     DBInfo    info
  3776.     CODE:
  3777.     RETVAL = pi_file_set_info(self->pf, &info);
  3778.     OUTPUT:
  3779.     RETVAL
  3780.  
  3781. int
  3782. setAppBlock(self, data)
  3783.     PDA::Pilot::File *    self
  3784.     SV *    data
  3785.     CODE:
  3786.     {
  3787.         STRLEN len;
  3788.         char * c;
  3789.         PackAI;
  3790.         c = SvPV(data, len);
  3791.         RETVAL = pi_file_set_app_info(self->pf, c, len);
  3792.     }
  3793.     OUTPUT:
  3794.     RETVAL
  3795.  
  3796. int
  3797. setSortBlock(self, data)
  3798.     PDA::Pilot::File *    self
  3799.     SV *    data
  3800.     CODE:
  3801.     {
  3802.         int len;
  3803.         char * c;
  3804.         PackSI;
  3805.         c = SvPV(data, len);
  3806.         RETVAL = pi_file_set_sort_info(self->pf, c, len);
  3807.     }
  3808.     OUTPUT:
  3809.     RETVAL
  3810.  
  3811. int
  3812. addResource(self, data, type, id)
  3813.     PDA::Pilot::File *    self
  3814.     SV *    data
  3815.     Char4    type
  3816.     int    id
  3817.     CODE:
  3818.     {
  3819.         STRLEN len;
  3820.         int result;
  3821.         void * buf;
  3822.         PackResource;
  3823.         buf = SvPV(data, len);
  3824.         RETVAL = pi_file_append_resource(self->pf, buf, len, type, id);
  3825.     }
  3826.     OUTPUT:
  3827.     RETVAL
  3828.  
  3829. int
  3830. addRecord(self, data)
  3831.     PDA::Pilot::File *    self
  3832.     SV *    data
  3833.     CODE:
  3834.     {
  3835.         STRLEN len;
  3836.         unsigned long id;
  3837.         int attr, category;
  3838.         int result;
  3839.         void * buf;
  3840.         PackRecord;
  3841.         buf = SvPV(data, len);
  3842.         RETVAL = pi_file_append_record(self->pf, buf, len, attr, category, id);
  3843.     }
  3844.     OUTPUT:
  3845.     RETVAL
  3846.  
  3847. int
  3848. addRecordRaw(self, data, uid, attr, category)
  3849.     PDA::Pilot::File *    self
  3850.     SV *    data
  3851.     unsigned long    uid
  3852.     int    attr
  3853.     int    category
  3854.     CODE:
  3855.     {
  3856.         STRLEN len;
  3857.         int result;
  3858.         void * buf;
  3859.         PackRaw;
  3860.         buf = SvPV(data, len);
  3861.         RETVAL = pi_file_append_record(self->pf, buf, len, attr, category, uid);
  3862.     }
  3863.     OUTPUT:
  3864.     RETVAL
  3865.  
  3866.  
  3867. int
  3868. install(self, socket, cardno)
  3869.     PDA::Pilot::File *    self
  3870.     PDA::Pilot::DLP *    socket
  3871.     int    cardno
  3872.     CODE:
  3873.     RETVAL = pi_file_install(self->pf, socket->socket, cardno);
  3874.     OUTPUT:
  3875.     RETVAL
  3876.  
  3877. int
  3878. retrieve(self, socket, cardno)
  3879.     PDA::Pilot::File *    self
  3880.     PDA::Pilot::DLP *    socket
  3881.     int    cardno
  3882.     CODE:
  3883.     RETVAL = pi_file_retrieve(self->pf, socket->socket, cardno);
  3884.     OUTPUT:
  3885.     RETVAL
  3886.  
  3887.